{
  "openapi": "3.0.0",
  "info": {
    "title": "AppSkyline API",
    "version": "1.0.0",
    "description": "Public REST API for AppSkyline. Authenticate with an API key created in the AppSkyline dashboard: send the base64-encoded key secret with HTTP Basic auth. Each key carries per-resource scopes like `keywords:read` or `apps:write`.",
    "x-api-versioning": {
      "currentVersion": "1",
      "requestHeader": "API-Version",
      "responseHeader": "API-Version",
      "compatibilityPolicy": "Omitting API-Version selects version 1. Unsupported versions return HTTP 400 with supportedVersions.",
      "deprecationPolicy": "AppSkyline announces incompatible versions at least 180 days before removal. Deprecated responses include Deprecation, Sunset, and a Link relation named deprecation.",
      "deprecationHeaders": [
        "Deprecation",
        "Sunset",
        "Link"
      ],
      "policyUrl": "https://www.appskyline.com/api.md#compatibility-version"
    }
  },
  "servers": [
    {
      "url": "https://api.appskyline.com"
    }
  ],
  "components": {
    "headers": {
      "Deprecation": {
        "description": "Present only when this API operation or version is deprecated. The value is an RFC 9745 Structured Field Date.",
        "schema": {
          "type": "string",
          "example": "@1893456000"
        }
      },
      "Sunset": {
        "description": "Present on deprecated responses when a retirement date is scheduled. The value is an HTTP-date.",
        "schema": {
          "type": "string",
          "example": "Tue, 01 Jan 2030 00:00:00 GMT"
        }
      },
      "DeprecationLink": {
        "description": "Present on deprecated responses and points to the applicable migration or deprecation policy with rel=\"deprecation\".",
        "schema": {
          "type": "string",
          "example": "<https://www.appskyline.com/api.md#compatibility-version>; rel=\"deprecation\""
        }
      }
    },
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "basic",
        "description": "HTTP Basic auth carrying only the API key secret: Authorization: Basic base64(<key secret>)."
      },
      "accessToken": {
        "type": "apiKey",
        "in": "header",
        "name": "Authorization",
        "description": "Operator session token issued by the AppSkyline dashboard: Authorization: Token <access token>."
      }
    },
    "schemas": {
      "App": {
        "type": "object",
        "required": [
          "_id",
          "organizationId",
          "name"
        ],
        "properties": {
          "_id": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "domain": {
            "type": "string"
          },
          "store": {
            "type": "string"
          },
          "country": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "Keyword": {
        "type": "object",
        "required": [
          "_id",
          "organizationId",
          "appId",
          "searchTerms"
        ],
        "properties": {
          "_id": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "appId": {
            "type": "string"
          },
          "searchTerms": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "language": {
            "type": "string"
          },
          "rank": {
            "type": "integer",
            "nullable": true
          }
        },
        "additionalProperties": true
      },
      "KeywordPage": {
        "type": "object",
        "required": [
          "items",
          "nextCursor"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Keyword"
            }
          },
          "nextCursor": {
            "nullable": true,
            "type": "string",
            "description": "Opaque cursor for the next page, or null after the final page"
          }
        },
        "additionalProperties": false
      },
      "EngagementRow": {
        "type": "object",
        "properties": {
          "appId": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "impressions": {
            "type": "integer"
          },
          "downloads": {
            "type": "integer"
          },
          "sessions": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      },
      "WebhookSubscription": {
        "type": "object",
        "required": [
          "_id",
          "organizationId",
          "url",
          "active"
        ],
        "properties": {
          "_id": {
            "type": "string"
          },
          "organizationId": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "active": {
            "type": "boolean"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "secret": {
            "type": "string",
            "description": "Returned only when the subscription is created."
          }
        },
        "additionalProperties": true
      },
      "DeleteResult": {
        "type": "object",
        "required": [
          "_id"
        ],
        "properties": {
          "_id": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "BatchOperation": {
        "type": "object",
        "required": [
          "alias",
          "url"
        ],
        "properties": {
          "alias": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Allowed collection plus optional query string."
          }
        }
      },
      "BatchResponse": {
        "type": "object",
        "description": "Map from each requested alias to its result array.",
        "additionalProperties": {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      },
      "Error": {
        "type": "object",
        "description": "Structured JSON API error.",
        "required": [
          "name",
          "message",
          "status"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "details": {
            "type": "object",
            "additionalProperties": true
          }
        }
      }
    }
  },
  "paths": {
    "/api/apple-app-store-engagement": {
      "get": {
        "tags": [
          "Stats"
        ],
        "summary": "Apple App Store engagement rows",
        "description": "Downloads/sessions engagement rows for your organization, optionally filtered by `appId` and a `days` cutoff. Requires the `stats:read` scope.\n",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "appId",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "days",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Array of engagement rows",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EngagementRow"
                  }
                }
              }
            }
          },
          "403": {
            "description": "API key is missing the `stats:read` scope",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "API key rate limit exceeded",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Retry-After": {
                "description": "Seconds until the request may be retried.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "getAppleAppStoreEngagement"
      }
    },
    "/api/apps": {
      "get": {
        "tags": [
          "Apps"
        ],
        "summary": "List apps",
        "description": "Lists the apps of your organization. Requires the `apps:read` scope.\n",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Array of apps",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/App"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid credentials",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "API key is missing the `apps:read` scope",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "API key rate limit exceeded",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Retry-After": {
                "description": "Seconds until the request may be retried.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "getApps",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ]
      },
      "post": {
        "tags": [
          "Apps"
        ],
        "summary": "Create an app",
        "description": "Requires the `apps:write` scope.",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The created app",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/App"
                }
              }
            }
          },
          "403": {
            "description": "API key is missing the `apps:write` scope",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Domain is already taken",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "postApps",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ]
      }
    },
    "/api/apps/{appId}": {
      "get": {
        "tags": [
          "Apps"
        ],
        "summary": "Get an app by id",
        "description": "Requires the `apps:read` scope.",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The app",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/App"
                }
              }
            }
          },
          "403": {
            "description": "API key is missing the `apps:read` scope",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such app in your organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "getAppsByAppId"
      },
      "put": {
        "tags": [
          "Apps"
        ],
        "summary": "Update an app",
        "description": "Requires the `apps:write` scope.",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated app",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/App"
                }
              }
            }
          },
          "404": {
            "description": "No such app in your organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Domain is already taken",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "putAppsByAppId"
      }
    },
    "/api/batch": {
      "post": {
        "tags": [
          "Batch"
        ],
        "summary": "Read multiple collections in one request",
        "description": "Executes an array of authenticated read operations and returns an object keyed by each operation alias. Only the allowlisted app, keyword, preference, role and metadata collections can be read.\n",
        "security": [
          {
            "accessToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "object",
                  "required": [
                    "alias",
                    "url"
                  ],
                  "properties": {
                    "alias": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "description": "Allowed collection plus optional query string"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results keyed by operation alias",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid credentials",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "A requested collection is not batch-readable",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "postBatch",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ]
      }
    },
    "/api/apps/{appId}/google-play/credentials/check": {
      "get": {
        "operationId": "googlePlayPublishingCredentials",
        "summary": "Verify saved Google Play release-read credentials without opening an edit",
        "description": "Requires `releases:read`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "track",
            "schema": {
              "type": "string",
              "default": "production"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/releases": {
      "get": {
        "operationId": "googlePlayPublishingReleases",
        "summary": "List Google Play review lifecycle states; policy explanations are unavailable",
        "description": "Requires `releases:read`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "track",
            "schema": {
              "type": "string",
              "default": "production"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/release/plan": {
      "post": {
        "operationId": "googlePlayPublishingPlan",
        "summary": "Preview full track release replacement without writing",
        "description": "Requires `releases:read`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "track",
            "schema": {
              "type": "string",
              "default": "production"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "versionCodes"
                ],
                "properties": {
                  "versionCodes": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^[1-9][0-9]*$"
                    }
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "draft",
                      "completed",
                      "inProgress",
                      "halted"
                    ],
                    "default": "completed"
                  },
                  "userFraction": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1,
                    "exclusiveMinimum": true,
                    "exclusiveMaximum": true
                  },
                  "name": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "releaseNotes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "language",
                        "text"
                      ],
                      "properties": {
                        "language": {
                          "type": "string"
                        },
                        "text": {
                          "type": "string",
                          "maxLength": 500
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits": {
      "post": {
        "operationId": "googlePlayPublishingCreate",
        "summary": "Open a Google Play edit; may invalidate an earlier edit",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits/{editId}": {
      "get": {
        "operationId": "googlePlayPublishingGet",
        "summary": "Read an edit",
        "description": "Requires `releases:read`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "googlePlayPublishingDelete",
        "summary": "Discard an edit",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits/{editId}/validate": {
      "post": {
        "operationId": "googlePlayPublishingValidate",
        "summary": "Validate an edit without committing",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits/{editId}/bundles": {
      "get": {
        "operationId": "googlePlayPublishingBundles",
        "summary": "List bundles within an edit",
        "description": "Requires `releases:read`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits/{editId}/bundle-upload": {
      "post": {
        "operationId": "googlePlayPublishingUpload",
        "summary": "Start a resumable AAB upload directly to Google",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported. Returns a secret uploadUrl capability, never OAuth credentials. PUT AAB bytes directly to that URL; do not log it. The edit is not committed.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "size"
                ],
                "properties": {
                  "size": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 2147483648
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits/{editId}/listings": {
      "get": {
        "operationId": "googlePlayPublishingMetadataRead",
        "summary": "Read localized listings in an edit",
        "description": "Requires `releases:read`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "put": {
        "operationId": "googlePlayPublishingMetadata",
        "summary": "Stage localized listing text",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "locales"
                ],
                "properties": {
                  "locales": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "object",
                      "required": [
                        "language",
                        "title",
                        "shortDescription",
                        "fullDescription"
                      ],
                      "properties": {
                        "language": {
                          "type": "string"
                        },
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 30
                        },
                        "shortDescription": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80
                        },
                        "fullDescription": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 4000
                        },
                        "video": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits/{editId}/tracks/{track}": {
      "put": {
        "operationId": "googlePlayPublishingTrack",
        "summary": "Replace all releases on this track within an edit",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "track",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "versionCodes"
                ],
                "properties": {
                  "versionCodes": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "pattern": "^[1-9][0-9]*$"
                    }
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "draft",
                      "completed",
                      "inProgress",
                      "halted"
                    ],
                    "default": "completed"
                  },
                  "userFraction": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1,
                    "exclusiveMinimum": true,
                    "exclusiveMaximum": true
                  },
                  "name": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "releaseNotes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "language",
                        "text"
                      ],
                      "properties": {
                        "language": {
                          "type": "string"
                        },
                        "text": {
                          "type": "string",
                          "maxLength": 500
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/edits/{editId}/commit": {
      "post": {
        "operationId": "googlePlayPublishingCommit",
        "summary": "Validate and commit; fail if changes are already in review",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported. A commit is not publication. deferReview=true requires subsequent Play Console submission. No automatic retry or review cancellation.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "editId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "deferReview": {
                    "type": "boolean",
                    "default": false
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/rollout/{track}": {
      "post": {
        "operationId": "googlePlayPublishingRollout",
        "summary": "Update or halt one existing rollout and commit, preserving other releases",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported. Opens and commits a new edit. Coordinate per-app jobs to avoid invalidating other edits. Fraction cannot decrease; 1 completes rollout.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "track",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "action",
                  "versionCode"
                ],
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "set",
                      "halt"
                    ]
                  },
                  "versionCode": {
                    "type": "string"
                  },
                  "fraction": {
                    "type": "number",
                    "minimum": 0,
                    "exclusiveMinimum": true,
                    "maximum": 1,
                    "description": "Required for set"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/google-play/data-safety": {
      "post": {
        "operationId": "googlePlayPublishingDataSafety",
        "summary": "Upload Data safety CSV outside the edit workflow",
        "description": "Requires `releases:write`. Uses the stored service account for this AppSkyline app. Organization-admin session writes are also supported.",
        "tags": [
          "Google Play Publishing"
        ],
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Operation result; includes appId and packageName. Commit is not proof of publication.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input or Google API error; details retain upstream status and review action",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Insufficient scope, app binding, or administrator role",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "App not found in the authenticated organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "safetyLabels"
                ],
                "properties": {
                  "safetyLabels": {
                    "type": "string",
                    "description": "Google Data safety CSV, maximum 1 MiB"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/keywords": {
      "get": {
        "tags": [
          "Keywords"
        ],
        "summary": "List keywords",
        "description": "Lists the tracked keywords of your organization, optionally filtered by `appId`. Requires the `keywords:read` scope. For stable traversal, set `pagination=cursor`; the response becomes `{items, nextCursor}` and is ordered by `_id`. Pass `nextCursor` back as `cursor` until it is null. The default array response and offset pagination remain unchanged when cursor pagination is not requested.\n",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "appId",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "pagination",
            "description": "Set to `cursor` for a stable page envelope",
            "schema": {
              "type": "string",
              "enum": [
                "cursor"
              ]
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "description": "Opaque `nextCursor` from the preceding cursor page",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "description": "Page size. Cursor mode defaults to 100 rows and caps at 500; the default array mode keeps 0 as unbounded.",
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "in": "query",
            "name": "skip",
            "schema": {
              "type": "integer",
              "default": 0
            }
          },
          {
            "in": "query",
            "name": "sortField",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "sortDirection",
            "schema": {
              "type": "string",
              "enum": [
                "ASC",
                "DESC"
              ]
            }
          },
          {
            "in": "query",
            "name": "fields",
            "description": "Comma-separated projection of fields to return",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Array of keywords, or `{items, nextCursor}` in cursor mode",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Keyword"
                      }
                    },
                    {
                      "$ref": "#/components/schemas/KeywordPage"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Malformed cursor, or a sort incompatible with cursor pagination",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid credentials",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "API key is missing the `keywords:read` scope",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "API key rate limit exceeded",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Retry-After": {
                "description": "Seconds until the request may be retried.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "getKeywords"
      },
      "post": {
        "tags": [
          "Keywords"
        ],
        "summary": "Create a keyword",
        "description": "Requires the `keywords:write` scope.",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The created keyword",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Keyword"
                }
              }
            }
          },
          "403": {
            "description": "API key is missing the `keywords:write` scope",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "postKeywords",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ]
      }
    },
    "/api/keywords/{keywordId}": {
      "get": {
        "tags": [
          "Keywords"
        ],
        "summary": "Get a keyword by id",
        "description": "Requires the `keywords:read` scope.",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "keywordId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The keyword",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Keyword"
                }
              }
            }
          },
          "403": {
            "description": "API key is missing the `keywords:read` scope",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such keyword in your organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "getKeywordsByKeywordId"
      },
      "put": {
        "tags": [
          "Keywords"
        ],
        "summary": "Update a keyword",
        "description": "Requires the `keywords:write` scope.",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "keywordId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated keyword",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Keyword"
                }
              }
            }
          },
          "404": {
            "description": "No such keyword in your organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "putKeywordsByKeywordId"
      },
      "delete": {
        "tags": [
          "Keywords"
        ],
        "summary": "Delete a keyword",
        "description": "Requires the `keywords:write` scope.",
        "security": [
          {
            "apiKey": []
          },
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "keywordId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Deleted",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Keyword"
                }
              }
            }
          },
          "404": {
            "description": "No such keyword in your organization",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "deleteKeywordsByKeywordId"
      }
    },
    "/api/sandbox/keywords": {
      "get": {
        "tags": [
          "Sandbox"
        ],
        "summary": "Read sandbox keyword ranks without authentication",
        "description": "Returns a fixed set of demonstration keyword-rank rows in the same `{searchTerms, store, country, rank}` shape as authenticated keyword reads. No account, credential, or key is required, so agents can evaluate the API before onboarding. Responses carry the standard `RateLimit` response headers and the anonymous pacing limit applies.\n",
        "security": [],
        "responses": {
          "200": {
            "description": "Demonstration keyword-rank rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "_id": {
                        "type": "string"
                      },
                      "searchTerms": {
                        "type": "string"
                      },
                      "store": {
                        "type": "string",
                        "enum": [
                          "ios-app-store",
                          "macos-app-store",
                          "google-play",
                          "microsoft-store"
                        ]
                      },
                      "country": {
                        "type": "string"
                      },
                      "rank": {
                        "type": "integer"
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            }
          },
          "429": {
            "description": "Anonymous rate limit exceeded; retry after `Retry-After` seconds.",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Retry-After": {
                "description": "Seconds until the request may be retried.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "getSandboxKeywords",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ]
      }
    },
    "/api/sandbox/rankchecks": {
      "post": {
        "tags": [
          "Sandbox"
        ],
        "summary": "Start a demonstration asynchronous rank check",
        "description": "Demonstrates the API's asynchronous-job pattern without authentication. The response is `202 Accepted` with a `Location` header pointing at the job resource and a body carrying the job `_id` and `status`. Poll the `Location` URL until the status is `succeeded`, then read the ranks from the job body. The job is deterministic fixture work that completes about two seconds after creation.\n",
        "security": [],
        "responses": {
          "202": {
            "description": "Job accepted; poll the `Location` URL for the result.",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              },
              "Location": {
                "description": "URL of the created job resource.",
                "schema": {
                  "type": "string",
                  "example": "/api/sandbox/rankchecks/c2FuZGJveGpvYnwxNzU2NTAwMDAwMDAw"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "_id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "running",
                        "succeeded"
                      ]
                    },
                    "creationTime": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Anonymous rate limit exceeded; retry after `Retry-After` seconds.",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              },
              "Retry-After": {
                "description": "Seconds until the request may be retried.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "postSandboxRankchecks",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ]
      }
    },
    "/api/sandbox/rankchecks/{jobId}": {
      "get": {
        "tags": [
          "Sandbox"
        ],
        "summary": "Poll a demonstration rank check",
        "description": "Reads the status of a demonstration job started at `POST /api/sandbox/rankchecks`. While the job runs the status is `running`; afterwards it is `succeeded` and the body carries the checked term's rank in every store carrying it. No authentication is required.\n",
        "security": [],
        "parameters": [
          {
            "in": "path",
            "name": "jobId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Current job state.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "_id": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "running",
                        "succeeded"
                      ]
                    },
                    "creationTime": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "completionTime": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "ranks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "searchTerms": {
                            "type": "string"
                          },
                          "store": {
                            "type": "string"
                          },
                          "country": {
                            "type": "string"
                          },
                          "rank": {
                            "type": "integer"
                          }
                        }
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            }
          },
          "404": {
            "description": "Unknown job id.",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "operationId": "getSandboxRankchecksByJobId"
      }
    },
    "/api/webhooksubscriptions": {
      "get": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "List webhook subscriptions",
        "description": "Webhook subscriptions deliver `app.created`, `app.updated`, `keyword.created`, `keyword.updated` and `keyword.deleted` events to your server as signed POST requests (`X-Appskyline-Signature: t=<timestamp>,v1=<hex HMAC-SHA256 of \"timestamp.body\">`). An endpoint failing 20 times in a row is disabled automatically. Subscriptions are managed with an operator access token; the `secret` is only returned once, on create.\n",
        "security": [
          {
            "accessToken": []
          }
        ],
        "responses": {
          "200": {
            "description": "Array of webhook subscriptions (without secrets)",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WebhookSubscription"
                  }
                }
              }
            }
          }
        },
        "operationId": "getWebhooksubscriptions",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          }
        ]
      },
      "post": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Create a webhook subscription",
        "description": "The response includes the signing `secret` exactly once — store it; it cannot be retrieved again.\n",
        "security": [
          {
            "accessToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "properties": {
                  "url": {
                    "type": "string",
                    "example": "https://example.com/appskyline-webhook"
                  },
                  "events": {
                    "type": "array",
                    "description": "Empty array subscribes to all events",
                    "items": {
                      "type": "string",
                      "enum": [
                        "app.created",
                        "app.updated",
                        "keyword.created",
                        "keyword.updated",
                        "keyword.deleted"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The created subscription, including its secret",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSubscription"
                }
              }
            }
          }
        },
        "operationId": "postWebhooksubscriptions",
        "parameters": [
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ]
      }
    },
    "/api/webhooksubscriptions/{webhookSubscriptionId}": {
      "put": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Update a webhook subscription",
        "description": "`url`, `events` and `active` are editable; the secret and organization are immutable. Re-enabling an auto-disabled endpoint is done by setting `active` back to true.\n",
        "security": [
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "webhookSubscriptionId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated subscription (without secret)",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSubscription"
                }
              }
            }
          }
        },
        "operationId": "putWebhooksubscriptionsByWebhookSubscriptionId"
      },
      "delete": {
        "tags": [
          "Webhook subscriptions"
        ],
        "summary": "Delete a webhook subscription",
        "security": [
          {
            "accessToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "webhookSubscriptionId",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "API-Version",
            "required": false,
            "description": "Compatibility version. Omit to use version 1; unsupported versions return 400.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ],
              "default": "1"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "description": "Unique retry key retained for 24 hours (maximum 255 characters).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Deleted",
            "headers": {
              "RateLimit": {
                "description": "Current quota, remaining requests, and reset time.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Policy": {
                "description": "Quota policy and window applied to the credential.",
                "schema": {
                  "type": "string"
                }
              },
              "API-Version": {
                "description": "Compatibility version used for the response.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "1"
                  ]
                }
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Link": {
                "$ref": "#/components/headers/DeprecationLink"
              },
              "Idempotency-Replayed": {
                "description": "True when a completed response was replayed for the supplied idempotency key.",
                "schema": {
                  "type": "boolean"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeleteResult"
                }
              }
            }
          }
        },
        "operationId": "deleteWebhooksubscriptionsByWebhookSubscriptionId"
      }
    }
  },
  "tags": []
}
