

```json
{
  "openapi": "3.0.0",
  "info": {
    "title": "Ads Unified Platform Publisher Public API",
    "description": "Ads Unified Platform - Public API for publishers",
    "version": "1.0.0",
    "contact": {
      "name": "Ads Unified Platform Team"
    },
    "x-slack-channel": "#ads-unified-platform"
  },
  "servers": [
    {
      "url": "https://services.api.unity.com/ads/publisher"
    }
  ],
  "paths": {
    "/public/v1/organizations/{organizationId}/test-devices": {
      "get": {
        "operationId": "publicOrganizationTestDevices",
        "summary": "Get organization test devices",
        "description": "Returns all test devices for the specified organization",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "platform",
            "required": false,
            "in": "query",
            "description": "Filter by Platform",
            "schema": {
              "enum": [
                "Android",
                "iOS",
                "OSX",
                "Windows",
                "Linux",
                "WebGL",
                "Windows_Store",
                "PS4",
                "PS5",
                "XboxOne",
                "tvOS",
                "Switch",
                "VisionOS"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved test devices",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TestDevicePublicResponseDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "test-devices"
        ]
      },
      "post": {
        "operationId": "publicCreateTestDevice",
        "summary": "Create test device",
        "description": "Creates a test device for the specified organization",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTestDevicePublicDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Successfully created test device",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestDevicePublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "test-devices"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/test-devices/{testDeviceId}": {
      "get": {
        "operationId": "publicGetTestDevice",
        "summary": "Get test device",
        "description": "Returns test device details by id",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "testDeviceId",
            "required": true,
            "in": "path",
            "description": "The Test Device ID",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved test device",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestDevicePublicResponseDto"
                }
              }
            }
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "test-devices"
        ]
      },
      "patch": {
        "operationId": "publicUpdateTestDevice",
        "summary": "Update test device",
        "description": "Updates an existing test device",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "testDeviceId",
            "required": true,
            "in": "path",
            "description": "The Test Device ID",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTestDevicePublicDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successfully updated test device",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TestDevicePublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "test-devices"
        ]
      },
      "delete": {
        "operationId": "publicDeleteTestDevice",
        "summary": "Delete test device",
        "description": "Deletes a test device by id",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "testDeviceId",
            "required": true,
            "in": "path",
            "description": "The Test Device ID",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "test-devices"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/applications": {
      "get": {
        "operationId": "publicOrganizationApplications",
        "summary": "Get applications for an organization",
        "description": "Returns all applications associated with a specific organization",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved organization applications",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ApplicationPublicResponseDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "applications"
        ]
      },
      "post": {
        "operationId": "publicCreateApplication",
        "summary": "Create an application",
        "description": "Creates a new application for a specific organization",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateApplicationPublicDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Successfully created application",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationPublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          }
        },
        "tags": [
          "applications"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/applications/{applicationId}": {
      "get": {
        "operationId": "publicGetApplicationById",
        "summary": "Get an application by ID",
        "description": "Returns application metadata for a specific application within an organization",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved application",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationPublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "applications"
        ]
      },
      "patch": {
        "operationId": "publicUpdateApplication",
        "summary": "Update an application",
        "description": "Updates an existing application for a specific organization (partial update)",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateApplicationPublicDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successfully updated application",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationPublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          },
          "409": {
            "description": "Resource conflict"
          }
        },
        "tags": [
          "applications"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/applications/{applicationId}/test-mode": {
      "get": {
        "operationId": "publicGetApplicationTestMode",
        "summary": "Get test mode",
        "description": "Get application test mode value.",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved test mode",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationTestModePublicResponseDto"
                }
              }
            }
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "applications"
        ]
      },
      "patch": {
        "operationId": "publicUpdateApplicationTestMode",
        "summary": "Update test mode",
        "description": "Update application test mode value.",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTestModePublicDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successfully updated test mode",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationTestModePublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "applications"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/applications/{applicationId}/placements": {
      "get": {
        "operationId": "publicApplicationPlacements",
        "summary": "Get placements",
        "description": "Returns all placements for a specific organization and application",
        "parameters": [
          {
            "name": "isArchived",
            "required": false,
            "in": "query",
            "description": "Filter by Archive/Unarchive",
            "schema": {
              "example": true,
              "type": "boolean"
            }
          },
          {
            "name": "adFormat",
            "required": false,
            "in": "query",
            "description": "Filter by ad formats",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "rewarded",
                  "interstitial",
                  "banner"
                ]
              }
            }
          },
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved placements",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PlacementPublicResponseDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "placements"
        ]
      },
      "post": {
        "operationId": "publicCreatePlacement",
        "summary": "Create placement",
        "description": "Creates a new placement for a specific organization and application",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlacementPublicRequestDto"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Successfully created placement",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlacementPublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "409": {
            "description": "Resource conflict"
          }
        },
        "tags": [
          "placements"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/applications/{applicationId}/placements/{placementId}": {
      "get": {
        "operationId": "publicGetPlacementDetails",
        "summary": "Get a placement details",
        "description": "Get an existing placement details for a specific organization and application",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "placementId",
            "required": true,
            "in": "path",
            "description": "The Placement ID",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved placement",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlacementPublicResponseDto"
                }
              }
            }
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "placements"
        ]
      },
      "put": {
        "operationId": "publicUpdatePlacement",
        "summary": "Update a placement",
        "description": "Updates an existing placement for a specific organization and application",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "placementId",
            "required": true,
            "in": "path",
            "description": "The Placement ID",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlacementPublicRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successfully updated placement",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlacementPublicResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "placements"
        ]
      },
      "delete": {
        "operationId": "publicArchivePlacement",
        "summary": "Archive (soft delete) a placement",
        "description": "Archive an existing placement for a specific organization and application",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "placementId",
            "required": true,
            "in": "path",
            "description": "The Placement ID",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No content"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "placements"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/applications/{applicationId}/placements/{placementId}/restore": {
      "patch": {
        "operationId": "publicUnArchivePlacement",
        "summary": "Un-Archive (restore) a placement",
        "description": "Un-Archive an existing placement for a specific organization and application",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "applicationId",
            "required": true,
            "in": "path",
            "description": "The Unity App ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "placementId",
            "required": true,
            "in": "path",
            "description": "The Placement ID",
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "name": "dryrun",
            "required": false,
            "in": "query",
            "description": "Dry-run mode. When `true`, the request is fully validated but no changes are persisted (DB writes are rolled back and external calls are skipped). The response echoes the would-be result with an `x-dry-run: true` header. For application create/update, dry-run validates the request and business rules only — it does not reserve names or guarantee downstream acceptance.",
            "schema": {
              "example": false,
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully un-archived placement"
          },
          "400": {
            "description": "Invalid request data"
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "placements"
        ]
      }
    },
    "/public/v1/organizations/{organizationId}/placements": {
      "get": {
        "operationId": "publicOrganizationPlacements",
        "summary": "Get placements for an organization",
        "description": "Returns all active iOS/Android placements across every application in the organization",
        "parameters": [
          {
            "name": "organizationId",
            "required": true,
            "in": "path",
            "description": "The Genesis ID of the organization",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successfully retrieved organization placements",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrganizationPlacementPublicResponseDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Authentication error"
          },
          "403": {
            "description": "Permission denied"
          },
          "404": {
            "description": "Resource not found"
          }
        },
        "tags": [
          "placements"
        ]
      }
    }
  },
  "tags": [
    {
      "name": "test-devices",
      "description": "Test devices management"
    },
    {
      "name": "applications",
      "description": "Publisher applications"
    },
    {
      "name": "placements",
      "description": "Publisher placements"
    }
  ],
  "components": {
    "schemas": {
      "CreateTestDevicePublicDto": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "description": "Device platform",
            "enum": [
              "Android",
              "iOS",
              "OSX",
              "Windows",
              "Linux",
              "WebGL",
              "Windows_Store",
              "PS4",
              "PS5",
              "XboxOne",
              "tvOS",
              "Switch",
              "VisionOS"
            ],
            "example": "iOS",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Test device display name",
            "example": "QA iPhone 15"
          },
          "advertisingId": {
            "type": "string",
            "description": "Advertising device identifier",
            "example": "AEBE52E7-03EE-455A-B3C4-E57283966239"
          }
        },
        "required": [
          "name",
          "advertisingId"
        ]
      },
      "TestDevicePublicResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the test device",
            "example": "550e8400-e29b-41d4-a716-446655440000"
          },
          "platform": {
            "type": "string",
            "description": "Device platform",
            "enum": [
              "Android",
              "iOS",
              "OSX",
              "Windows",
              "Linux",
              "WebGL",
              "Windows_Store",
              "PS4",
              "PS5",
              "XboxOne",
              "tvOS",
              "Switch",
              "VisionOS"
            ],
            "example": "iOS",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Test device display name",
            "example": "QA iPhone 15"
          },
          "advertisingId": {
            "type": "string",
            "description": "Advertising device identifier",
            "example": "AEBE52E7-03EE-455A-B3C4-E57283966239"
          }
        },
        "required": [
          "id",
          "name",
          "advertisingId"
        ]
      },
      "UpdateTestDevicePublicDto": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "description": "Device platform",
            "enum": [
              "Android",
              "iOS",
              "OSX",
              "Windows",
              "Linux",
              "WebGL",
              "Windows_Store",
              "PS4",
              "PS5",
              "XboxOne",
              "tvOS",
              "Switch",
              "VisionOS"
            ],
            "example": "iOS",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Test device display name",
            "example": "QA iPhone 15"
          },
          "advertisingId": {
            "type": "string",
            "description": "Advertising device identifier",
            "example": "AEBE52E7-03EE-455A-B3C4-E57283966239"
          }
        }
      },
      "ApplicationPublicResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Application unique identifier",
            "example": "550e8400-e29b-41d4-a716-446655440000"
          },
          "name": {
            "type": "string",
            "description": "Application name",
            "example": "My Game App"
          },
          "gameId": {
            "type": "number",
            "description": "Publisher game id associated with the application",
            "nullable": true,
            "example": 12345
          },
          "platform": {
            "type": "string",
            "description": "Application platform",
            "enum": [
              "Android",
              "iOS",
              "OSX",
              "Windows",
              "Linux",
              "WebGL",
              "Windows_Store",
              "PS4",
              "PS5",
              "XboxOne",
              "tvOS",
              "Switch",
              "VisionOS"
            ],
            "example": "iOS"
          },
          "iconUrl": {
            "type": "string",
            "description": "Application icon URL",
            "nullable": true,
            "example": "https://example.com/icon.png"
          },
          "projectId": {
            "type": "string",
            "description": "Project the application belongs to",
            "format": "uuid",
            "nullable": true,
            "example": "5a8591dd-4039-49df-9202-96385ba3eff8"
          },
          "storeId": {
            "type": "string",
            "description": "Store identifier (bundle id / package name)",
            "nullable": true,
            "example": "com.example.app"
          },
          "store": {
            "type": "string",
            "description": "Store the application is published in",
            "enum": [
              "GooglePlay",
              "AppleAppStore",
              "SamsungGalaxy",
              "AmazonAppStore",
              "MacAppStore",
              "UDP",
              "MicrosoftStore",
              "HuaweiAppGallery",
              "APK"
            ],
            "nullable": true,
            "example": "AppleAppStore"
          },
          "testMode": {
            "type": "string",
            "description": "Application Test Mode",
            "enum": [
              "forceAll",
              "forceOff"
            ],
            "example": "forceAll",
            "nullable": true
          },
          "kidsSettings": {
            "type": "boolean",
            "description": "Kids settings flag",
            "example": false
          },
          "coppa": {
            "type": "boolean",
            "description": "COPPA compliance flag",
            "nullable": true,
            "example": false
          },
          "mixedAudience": {
            "type": "boolean",
            "description": "Mixed audience flag",
            "nullable": true,
            "example": false
          }
        },
        "required": [
          "id",
          "name",
          "gameId",
          "platform",
          "iconUrl",
          "projectId",
          "storeId",
          "store",
          "testMode",
          "kidsSettings",
          "coppa",
          "mixedAudience"
        ]
      },
      "PrivacyPublicDto": {
        "type": "object",
        "properties": {
          "coppa": {
            "type": "boolean",
            "description": "COPPA compliance flag"
          },
          "mixedAudience": {
            "type": "boolean",
            "description": "Mixed audience flag"
          }
        },
        "required": [
          "coppa",
          "mixedAudience"
        ]
      },
      "CreateApplicationPublicDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Application name"
          },
          "platform": {
            "type": "string",
            "description": "Application platform"
          },
          "iconUrl": {
            "type": "string",
            "description": "Application icon URL",
            "format": "uri"
          },
          "storeId": {
            "type": "string",
            "description": "Store identifier"
          },
          "store": {
            "type": "string",
            "description": "Store name"
          },
          "privacy": {
            "description": "Privacy settings",
            "allOf": [
              {
                "$ref": "#/components/schemas/PrivacyPublicDto"
              }
            ]
          },
          "projectId": {
            "type": "string",
            "description": "ID of the project to associate the new app with",
            "format": "uuid"
          },
          "projectName": {
            "type": "string",
            "description": "Name for a new project to create and associate the app with. Only used when projectId is not provided; defaults to the application name when omitted."
          }
        },
        "required": [
          "name",
          "platform"
        ]
      },
      "PrivacyUpdatePublicDto": {
        "type": "object",
        "properties": {
          "coppa": {
            "type": "boolean",
            "description": "COPPA compliance flag"
          },
          "mixedAudience": {
            "type": "boolean",
            "description": "Mixed audience flag"
          }
        }
      },
      "UpdateApplicationPublicDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Application name"
          },
          "storeId": {
            "type": "string",
            "description": "Store identifier"
          },
          "store": {
            "type": "string",
            "description": "Store name"
          },
          "privacy": {
            "description": "Privacy settings",
            "allOf": [
              {
                "$ref": "#/components/schemas/PrivacyUpdatePublicDto"
              }
            ]
          },
          "kidsSettings": {
            "type": "boolean",
            "description": "Kids settings flag. When true, triggers a USF update with coppa=true."
          }
        }
      },
      "ApplicationTestModePublicResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Application unique identifier",
            "example": "550e8400-e29b-41d4-a716-446655440000"
          },
          "gameId": {
            "type": "number",
            "description": "Publisher game id associated with the application",
            "nullable": true,
            "example": 12345
          },
          "testMode": {
            "type": "string",
            "description": "Application Test Mode",
            "enum": [
              "forceAll",
              "forceOff"
            ],
            "example": "forceAll",
            "nullable": true
          }
        },
        "required": [
          "id",
          "gameId",
          "testMode"
        ]
      },
      "UpdateTestModePublicDto": {
        "type": "object",
        "properties": {
          "testMode": {
            "type": "string",
            "description": "Test Mode",
            "enum": [
              "forceAll",
              "forceOff"
            ],
            "example": "forceAll",
            "nullable": true
          }
        },
        "required": [
          "testMode"
        ]
      },
      "AdminConfigurations": {
        "type": "object",
        "properties": {
          "allowSkip": {
            "type": "boolean",
            "description": "Allow Skip configuration",
            "example": false
          },
          "allowSkipInSeconds": {
            "type": "number",
            "description": "Ad Skip Timer configuration",
            "example": 5
          },
          "videoPlayableSkipInSeconds": {
            "type": "number",
            "description": "VP-Playable Timer configuration",
            "example": 5
          },
          "closeTimerDuration": {
            "type": "number",
            "description": "End-screen Close Timer configuration",
            "example": 5
          },
          "tapsToClose": {
            "type": "number",
            "description": "Taps to Close configuration",
            "example": 2
          },
          "muteVideo": {
            "type": "boolean",
            "description": "Video Audio configuration",
            "example": true
          },
          "disableVideoControlsFade": {
            "type": "boolean",
            "description": "UI Fade configuration",
            "example": true
          },
          "useCloseIconInsteadOfSkipIcon": {
            "type": "boolean",
            "description": "Skip Icon configuration. Fast Forward arrow used instead of a traditional X",
            "example": true
          }
        },
        "required": [
          "allowSkip",
          "allowSkipInSeconds",
          "videoPlayableSkipInSeconds",
          "closeTimerDuration",
          "tapsToClose",
          "muteVideo",
          "disableVideoControlsFade",
          "useCloseIconInsteadOfSkipIcon"
        ]
      },
      "RewardedConfigurations": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Reward name, applicable to adUnit only",
            "example": "coins"
          },
          "value": {
            "type": "number",
            "description": "Reward value, applicable to adUnit only",
            "example": 100
          },
          "adminSettings": {
            "description": "Admin Configuration, applicable to placement only",
            "allOf": [
              {
                "$ref": "#/components/schemas/AdminConfigurations"
              }
            ]
          }
        },
        "required": [
          "name",
          "value"
        ]
      },
      "InterstitialConfigurations": {
        "type": "object",
        "properties": {
          "adminSettings": {
            "description": "Admin Configuration, applicable to placement only",
            "allOf": [
              {
                "$ref": "#/components/schemas/AdminConfigurations"
              }
            ]
          }
        }
      },
      "BannerConfigurations": {
        "type": "object",
        "properties": {
          "adminSettings": {
            "description": "Admin Configuration, applicable to placement only",
            "allOf": [
              {
                "$ref": "#/components/schemas/AdminConfigurations"
              }
            ]
          },
          "bannerRefreshRate": {
            "type": "number",
            "description": "Banner refresh rate in seconds",
            "example": 10
          }
        },
        "required": [
          "bannerRefreshRate"
        ]
      },
      "PlacementPublicRequestDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Placement name",
            "example": "Rewarded Placement"
          },
          "adFormat": {
            "type": "string",
            "description": "Placement Ad format type",
            "enum": [
              "rewarded",
              "interstitial",
              "banner"
            ],
            "example": "rewarded"
          },
          "adFormatConfigurations": {
            "description": "Ad Format Configuration. Structure depends on adFormat",
            "anyOf": [
              {
                "$ref": "#/components/schemas/RewardedConfigurations"
              },
              {
                "$ref": "#/components/schemas/InterstitialConfigurations"
              },
              {
                "$ref": "#/components/schemas/BannerConfigurations"
              }
            ]
          }
        },
        "required": [
          "name",
          "adFormat"
        ]
      },
      "PlacementPublicResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Placement unique identifier",
            "example": "550e8400-e29b-41d4-a716-446655440000"
          },
          "key": {
            "type": "string",
            "description": "Human-readable Id, generated from name",
            "example": "Rewarded_Placement"
          },
          "name": {
            "type": "string",
            "description": "Placement name",
            "example": "Rewarded Video"
          },
          "gameId": {
            "type": "number",
            "description": "Publisher game id of the application the placement belongs to",
            "nullable": true,
            "example": 12345
          },
          "adFormat": {
            "type": "string",
            "description": "Ad format type",
            "enum": [
              "rewarded",
              "interstitial",
              "banner",
              "native"
            ],
            "example": "rewarded"
          },
          "status": {
            "type": "string",
            "description": "Placement status",
            "enum": [
              "active",
              "paused"
            ],
            "example": "active"
          },
          "adFormatConfigurations": {
            "type": "object",
            "description": "Ad Format Configuration. Structure depends on adFormat"
          },
          "applicationId": {
            "type": "string",
            "description": "Public identifier of the application the placement belongs to",
            "example": "550e8400-e29b-41d4-a716-446655440000"
          },
          "archivedAt": {
            "type": "string",
            "description": "Archive timestamp. Null when placement is active",
            "format": "date-time",
            "example": "2024-01-01T00:00:00.000Z",
            "nullable": true
          },
          "createdAt": {
            "format": "date-time",
            "type": "string",
            "description": "Creation timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string",
            "description": "Last update timestamp",
            "example": "2024-01-01T00:00:00.000Z"
          }
        },
        "required": [
          "id",
          "key",
          "name",
          "gameId",
          "adFormat",
          "status",
          "applicationId",
          "archivedAt",
          "createdAt",
          "updatedAt"
        ]
      },
      "OrganizationPlacementPublicResponseDto": {
        "type": "object",
        "properties": {
          "placementId": {
            "type": "string",
            "description": "Human-readable placement identifier (the placement key)",
            "example": "Banner_Android"
          },
          "name": {
            "type": "string",
            "description": "Placement name",
            "example": "Banner Android"
          },
          "placementType": {
            "type": "string",
            "description": "Placement type",
            "example": "bidding"
          },
          "gameId": {
            "type": "integer",
            "description": "Publisher game id of the application the placement belongs to",
            "example": 1052964,
            "nullable": true
          },
          "adFormat": {
            "type": "string",
            "description": "Ad format type",
            "enum": [
              "rewarded",
              "interstitial",
              "banner",
              "native"
            ],
            "example": "banner"
          },
          "platform": {
            "type": "string",
            "description": "Platform of the application the placement belongs to. Empty string when the platform is neither iOS nor Android.",
            "enum": [
              "ios",
              "android",
              ""
            ],
            "example": "android"
          },
          "storeId": {
            "type": "string",
            "description": "Store identifier of the application (bundle id on Android, numeric id on iOS)",
            "example": "com.google",
            "nullable": true
          }
        },
        "required": [
          "placementId",
          "name",
          "placementType",
          "gameId",
          "adFormat",
          "platform",
          "storeId"
        ]
      }
    }
  }
}
```