{
  "openapi": "3.0.4",
  "info": {
    "title": "ASO.dev Partners API",
    "description": "Partner-facing API and documentation for ASO.dev integrations.",
    "version": "v1"
  },
  "paths": {
    "/v1/apps/charts/query": {
      "post": {
        "tags": [
          "AppCharts"
        ],
        "summary": "Returns stored daily top apps for one App Store category chart.",
        "description": "Cost: max(1, ceil(returned_page_limit / 25)) credits; default limit 500, max limit 500\n\nBilling unit: `app_chart_row`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "queryAppChart",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartQueryRequest"
              },
              "example": {
                "country": "US",
                "lang": "en-US",
                "platform": "ios",
                "type": "free",
                "category_id": 6024,
                "limit": 500,
                "offset": 0
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartQueryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppChartQueryResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_chart_row",
          "cost": "max(1, ceil(returned_page_limit / 25)) credits; default limit 500, max limit 500",
          "formula": "max(1, ceil(limit / 25))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/apps/charts/live": {
      "post": {
        "tags": [
          "AppCharts"
        ],
        "summary": "Returns current free, paid, or grossing apps from Apple for one App Store category chart. Free and paid use the scheduled AMP top-500 source; grossing uses the scheduled RSS top-200 source.",
        "description": "Cost: 0 credits when no rows are returned; otherwise max(1, ceil(actual_returned_rows / 25)) credits. Dry-run estimates the maximum from limit and the source maximum; default limit 500, max limit 500\n\nBilling unit: `app_chart_row`. Use `dry_run=true` to return the maximum pre-call estimate from `limit` and the source maximum; final usage is reconciled to the actual returned rows.\n\nRequest timeout: `10` minutes.",
        "operationId": "getAppChartLive",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartLiveRequest"
              },
              "example": {
                "country": "US",
                "lang": "en-US",
                "platform": "ios",
                "type": "free",
                "category_id": 6024,
                "limit": 500,
                "offset": 0
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartLiveRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartLiveRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppChartQueryResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_chart_row",
          "cost": "0 credits when no rows are returned; otherwise max(1, ceil(actual_returned_rows / 25)) credits. Dry-run estimates the maximum from limit and the source maximum; default limit 500, max limit 500",
          "formula": "returned_rows == 0 ? 0 : max(1, ceil(returned_rows / 25))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/apps/charts/query-with-meta": {
      "post": {
        "tags": [
          "AppCharts"
        ],
        "summary": "Returns stored daily top apps and preview-refreshed app metadata for one App Store category chart.",
        "description": "Cost: max(1, ceil(returned_page_limit / 20)) credits; default limit 500, max limit 500\n\nBilling unit: `app_chart_row`. Use `dry_run=true` to return an exact estimate before running the operation.\n\nRequest timeout: `10` minutes.",
        "operationId": "queryAppChartWithMeta",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartWithMetaQueryRequest"
              },
              "example": {
                "country": "US",
                "lang": "en-US",
                "platform": "ios",
                "type": "free",
                "category_id": 6024,
                "limit": 500,
                "offset": 0
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartWithMetaQueryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppChartWithMetaQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppChartWithMetaQueryResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_chart_row",
          "cost": "max(1, ceil(returned_page_limit / 20)) credits; default limit 500, max limit 500",
          "formula": "max(1, ceil(limit / 20))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/apps/rankings/current": {
      "post": {
        "tags": [
          "AppRankings"
        ],
        "summary": "Returns the latest stored category ranking positions for one app.",
        "description": "Cost: max(1, ceil(returned_page_limit / 25)) credits; default limit 100, max limit 1000\n\nBilling unit: `app_ranking_row`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getAppRankingsCurrent",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppRankingsCurrentRequest"
              },
              "example": {
                "app_id": "375380948",
                "platform": "ios",
                "countries": [
                  "US"
                ],
                "types": [
                  "free"
                ],
                "category_ids": [
                  6024
                ],
                "limit": 100,
                "offset": 0
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppRankingsCurrentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppRankingsCurrentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppRankingsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_ranking_row",
          "cost": "max(1, ceil(returned_page_limit / 25)) credits; default limit 100, max limit 1000",
          "formula": "max(1, ceil(limit / 25))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/apps/rankings/history": {
      "post": {
        "tags": [
          "AppRankings"
        ],
        "summary": "Returns stored category ranking positions for one app over a date range.",
        "description": "Cost: max(1, ceil(returned_page_limit / 25)) credits; default limit 100, max limit 1000\n\nBilling unit: `app_ranking_row`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getAppRankingsHistory",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppRankingsHistoryRequest"
              },
              "example": {
                "app_id": "375380948",
                "platform": "ios",
                "countries": [
                  "US"
                ],
                "types": [
                  "free"
                ],
                "category_ids": [
                  6024
                ],
                "date_from": "2026-05-01",
                "date_to": "2026-05-02",
                "limit": 100,
                "offset": 0
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppRankingsHistoryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppRankingsHistoryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppRankingsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_ranking_row",
          "cost": "max(1, ceil(returned_page_limit / 25)) credits; default limit 100, max limit 1000",
          "formula": "max(1, ceil(limit / 25))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/apps/reviews/query": {
      "post": {
        "tags": [
          "AppReviews"
        ],
        "summary": "Returns stored App Store reviews for one app from newest to oldest.",
        "description": "Cost: max(3, ceil(returned_page_limit / 100) * 3) credits; default limit 100, max limit 10000\n\nBilling unit: `review`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "queryAppReviews",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppReviewsQueryRequest"
              },
              "example": {
                "app_id": "375380948",
                "countries": [
                  "US"
                ],
                "date_from": "2026-05-01",
                "date_to": "2026-05-02",
                "limit": 100,
                "offset": 0
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppReviewsQueryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppReviewsQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppReviewsQueryResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "review",
          "cost": "max(3, ceil(returned_page_limit / 100) * 3) credits; default limit 100, max limit 10000",
          "formula": "max(3, ceil(limit / 100) * 3)",
          "minimum_credits": 3,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/apps/details/query": {
      "post": {
        "tags": [
          "Apps"
        ],
        "summary": "Returns the latest stored metadata for one app and country from ASO.dev's database.",
        "description": "Cost: 1 credit per app-country lookup\n\nBilling unit: `app_country`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "queryAppDetails",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppDetailsQueryRequest"
              },
              "example": {
                "app_id": "6445911688",
                "country": "US"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppDetailsQueryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppDetailsQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppDetailsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_country",
          "cost": "1 credit per app-country lookup",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/apps/details/live": {
      "post": {
        "tags": [
          "Apps"
        ],
        "summary": "Returns live App Store metadata for one app and country.",
        "description": "Cost: 3 credits per live app-country lookup\n\nBilling unit: `app_country`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getAppDetailsLive",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppDetailsLiveRequest"
              },
              "example": {
                "app_id": "6445911688",
                "country": "US"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppDetailsLiveRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppDetailsLiveRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppDetailsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Live App Store data, the credit ledger, or request-accounting storage is temporarily unavailable. Live lookup failures return error_code=live_data_unavailable; unavailable Public API runtime storage returns error_code=public_api_storage_unavailable.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying a temporarily unavailable live lookup.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "live_data_unavailable": {
                    "summary": "Live App Store lookup temporarily unavailable",
                    "value": {
                      "type": "https://developer.aso.dev/errors/live_data_unavailable",
                      "title": "Live data temporarily unavailable",
                      "status": 503,
                      "detail": "Live App Store data could not be retrieved. Retry the request later.",
                      "error_code": "live_data_unavailable",
                      "request_id": "req_01JEXAMPLE",
                      "retryable": true
                    }
                  },
                  "public_api_storage_unavailable": {
                    "summary": "Public API request-accounting storage temporarily unavailable",
                    "value": {
                      "type": "https://developer.aso.dev/errors/public_api_storage_unavailable",
                      "title": "Service temporarily unavailable",
                      "status": 503,
                      "detail": "Public API request accounting storage is temporarily unavailable. Retry the request later.",
                      "error_code": "public_api_storage_unavailable",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_country",
          "cost": "3 credits per live app-country lookup",
          "formula": "3",
          "minimum_credits": 3,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/auth/test": {
      "get": {
        "tags": [
          "Auth"
        ],
        "summary": "Verifies that the public API project, routing, JSON contract, and docs pipeline are alive.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "testAuth",
        "parameters": [
          {
            "name": "X-Request-ID",
            "in": "header",
            "description": "Optional client request identifier.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthTestResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/dictionaries/countries": {
      "get": {
        "tags": [
          "Dictionaries"
        ],
        "summary": "Returns all App Store countries supported by app and non-keyword endpoints.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getSupportedCountries",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportedCountriesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/dictionaries/keywords/countries": {
      "get": {
        "tags": [
          "Dictionaries"
        ],
        "summary": "Returns countries supported by keyword endpoints.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getSupportedKeywordCountries",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportedCountriesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/dictionaries/app-categories": {
      "get": {
        "tags": [
          "Dictionaries"
        ],
        "summary": "Returns App Store category ids supported by app ranking endpoints.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getSupportedAppCategories",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupportedAppCategoriesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords/live-search": {
      "post": {
        "tags": [
          "KeywordLiveSearch"
        ],
        "summary": "Returns selected-app live rank or full organic result page for one keyword.",
        "description": "Cost: 5 credits when app_id is provided; 20 credits when app_id is omitted\n\nBilling unit: `app_keyword or full_serp`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getKeywordLiveSearch",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordLiveSearchRequest"
              },
              "example": {
                "app_id": "6445911688",
                "keyword": "aso",
                "country": "US",
                "platform": "ios"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordLiveSearchRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordLiveSearchRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordLiveSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_keyword or full_serp",
          "cost": "5 credits when app_id is provided; 20 credits when app_id is omitted",
          "formula": "app_id ? 5 : 20",
          "minimum_credits": 5,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords/rankings/current": {
      "post": {
        "tags": [
          "KeywordRankings"
        ],
        "summary": "Returns yesterday and today stored ranks for one app and an optional keyword list.",
        "description": "Cost: max(1, ceil(billable_app_keyword_dates / 5)) credits; current rankings return yesterday and today, and keyword-date rows for non-manual apps owned by the authenticated user receive a 50% billing discount; when keywords is omitted, row count is min(remaining stored keyword-date rows after offset, limit), default limit 10; limit=0 counts all remaining yesterday/today keyword-date rows\n\nBilling unit: `app_keyword_date`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getKeywordRankingsCurrent",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsCurrentRequest"
              },
              "example": {
                "app_id": "6445911688",
                "country": "US",
                "platform": "ios",
                "keywords": [
                  "aso"
                ]
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsCurrentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsCurrentRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordRankingsCurrentResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_keyword_date",
          "cost": "max(1, ceil(billable_app_keyword_dates / 5)) credits; current rankings return yesterday and today, and keyword-date rows for non-manual apps owned by the authenticated user receive a 50% billing discount; when keywords is omitted, row count is min(remaining stored keyword-date rows after offset, limit), default limit 10; limit=0 counts all remaining yesterday/today keyword-date rows",
          "formula": "max(1, ceil((full_price_app_keyword_dates + discounted_app_keyword_dates * 0.5) / 5))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords/rankings/history": {
      "post": {
        "tags": [
          "KeywordRankings"
        ],
        "summary": "Returns historical stored ranks for one or more apps and a keyword list.",
        "description": "Cost: max(1, ceil(billable_app_keyword_days / 10)) credits; app-keyword-days for non-manual apps owned by the authenticated user receive a 50% billing discount\n\nBilling unit: `app_keyword_day`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getKeywordRankingsHistory",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsHistoryRequest"
              },
              "example": {
                "app_ids": [
                  "6445911688"
                ],
                "country": "US",
                "platform": "ios",
                "keywords": [
                  "aso"
                ],
                "date_from": "2026-05-01",
                "date_to": "2026-05-02"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsHistoryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsHistoryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordRankingsHistoryResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "app_keyword_day",
          "cost": "max(1, ceil(billable_app_keyword_days / 10)) credits; app-keyword-days for non-manual apps owned by the authenticated user receive a 50% billing discount",
          "formula": "max(1, ceil((full_price_app_keyword_days + discounted_app_keyword_days * 0.5) / 10))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords/rankings/live": {
      "post": {
        "tags": [
          "KeywordRankings"
        ],
        "summary": "Returns live keyword rankings for the requested country, keywords, and selected app.",
        "description": "Cost: max(1, ceil(keyword_count * limit / 10)) credits; offset snapshot pages cost 1 credit\n\nBilling unit: `keyword_app`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getKeywordRankingsLive",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsLiveRequest"
              },
              "example": {
                "app_id": "6445911688",
                "country": "US",
                "platform": "ios",
                "keywords": [
                  "aso"
                ],
                "limit": 10,
                "offset": 0
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsLiveRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordRankingsLiveRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordRankingLiveResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "keyword_app",
          "cost": "max(1, ceil(keyword_count * limit / 10)) credits; offset snapshot pages cost 1 credit",
          "formula": "max(1, ceil(keyword_count * limit / 10))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords/search/query": {
      "post": {
        "tags": [
          "KeywordSearch"
        ],
        "summary": "Returns the latest stored selected-app rank or organic result page for one keyword.",
        "description": "Cost: 1 credit\n\nBilling unit: `keyword_search`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "queryKeywordSearch",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordSearchQueryRequest"
              },
              "example": {
                "app_id": "6445911688",
                "keyword": "aso",
                "country": "US",
                "platform": "ios"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordSearchQueryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordSearchQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordLiveSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "keyword_search",
          "cost": "1 credit",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords-tracking": {
      "post": {
        "tags": [
          "KeywordsTracking"
        ],
        "summary": "Returns configured tracked keywords for an app in a project.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getKeywordsTracking",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingListRequest"
              },
              "example": {
                "project_id": "demo_project",
                "app_id": "6445911688",
                "country": "US",
                "platform": "ios",
                "page": 1,
                "page_size": 50
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingListRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingListRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordsTrackingListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      },
      "put": {
        "tags": [
          "KeywordsTracking"
        ],
        "summary": "Replaces the tracked keyword list for an app/country/platform.",
        "description": "Cost: 1 credit per update request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "putKeywordsTracking",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingPutRequest"
              },
              "example": {
                "project_id": "demo_project",
                "app_id": "6445911688",
                "country": "US",
                "platform": "ios",
                "keywords": [
                  "aso"
                ]
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingPutRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingPutRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordsTrackingMutationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per update request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      },
      "patch": {
        "tags": [
          "KeywordsTracking"
        ],
        "summary": "Adds and removes tracked keywords for an app/country/platform.",
        "description": "Cost: 1 credit per update request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "patchKeywordsTracking",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingPatchRequest"
              },
              "example": {
                "project_id": "demo_project",
                "app_id": "6445911688",
                "country": "US",
                "platform": "ios",
                "add_keywords": [
                  "aso"
                ]
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingPatchRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingPatchRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordsTrackingMutationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per update request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords-tracking/{tracking_id}": {
      "delete": {
        "tags": [
          "KeywordsTracking"
        ],
        "summary": "Deletes one tracked keyword entry by id. The operation is idempotent.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "deleteKeywordsTracking",
        "parameters": [
          {
            "name": "tracking_id",
            "in": "path",
            "description": "Tracking id to delete. Required.",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "demo_tracking"
          },
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordsTrackingDeleteResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/keywords-tracking/rankings": {
      "post": {
        "tags": [
          "KeywordsTracking"
        ],
        "summary": "Returns stored rankings for tracked keywords.",
        "description": "Cost: max(1, ceil(billable_tracking_units)) credits; tracking units for non-manual apps owned by the authenticated user receive a 50% billing discount; when dates are omitted, day_count=1\n\nBilling unit: `tracking_data_unit`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getKeywordsTrackingRankings",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingRankingsRequest"
              },
              "example": {
                "app_id": "6445911688",
                "country": "US",
                "platform": "ios",
                "keywords": [
                  "aso"
                ]
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingRankingsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/KeywordsTrackingRankingsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeywordsTrackingRankingsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "tracking_data_unit",
          "cost": "max(1, ceil(billable_tracking_units)) credits; tracking units for non-manual apps owned by the authenticated user receive a 50% billing discount; when dates are omitted, day_count=1",
          "formula": "max(1, ceil(full_price_tracking_units + discounted_tracking_units * 0.5))",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/partners/test": {
      "get": {
        "tags": [
          "Partners"
        ],
        "summary": "Verifies that the partners surface is active.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "testPartnersSurface",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SurfaceTestResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    },
    "/v1/projects": {
      "get": {
        "tags": [
          "Projects"
        ],
        "summary": "Returns active ASO.dev projects for the user email attached to the authenticated API key.",
        "description": "Cost: 1 credit per successful request\n\nBilling unit: `request`. Use `dry_run=true` to return an exact estimate before running the operation.",
        "operationId": "getProjects",
        "parameters": [
          {
            "name": "dry_run",
            "in": "query",
            "description": "Set to true to return only the estimated usage and credits for this request. Dry-run requests do not execute the operation and do not debit the account balance.",
            "schema": {
              "type": "boolean"
            },
            "example": false
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectsListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Validation failed. Body is ValidationProblemDetails."
          },
          "401": {
            "description": "Missing or invalid X-API-Key. Body is ProblemDetails with error_code=unauthorized."
          },
          "402": {
            "description": "Developer account credits are insufficient. Body is ProblemDetails with error_code=insufficient_credits."
          },
          "403": {
            "description": "Operation or data scope is not allowed. Body is ProblemDetails with error_code."
          },
          "429": {
            "description": "API key rate limit, dry-run rate limit, no-data rate guard, operation quota, or API key monthly credit limit exceeded. Rate-limit, no-data, and operation-quota responses include Retry-After and identify the exact quota. no_data_rate_limit_exceeded also includes the block reason, unlock time, and evaluated ratio.",
            "headers": {
              "Retry-After": {
                "description": "Seconds until the exhausted window resets or the temporary key block expires.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicApiRateLimitProblemDetails"
                },
                "examples": {
                  "minute_limit": {
                    "summary": "API key minute limit exceeded",
                    "value": {
                      "type": "https://developer.aso.dev/errors/operation_quota_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key rate limit exceeded: 120 requests per minute.",
                      "error_code": "operation_quota_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "api",
                      "quota_limit_type": "minute",
                      "quota_limit": 120,
                      "quota_window_seconds": 60
                    }
                  },
                  "no_data_block": {
                    "summary": "API key temporarily blocked by the no-data guard",
                    "value": {
                      "type": "https://developer.aso.dev/errors/no_data_rate_limit_exceeded",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Public API key is temporarily blocked until 2026-07-30T15:05:00.0000000+00:00: no_data rate 81.09% (163 of 201 data requests) exceeded 80% after more than 200 requests in the trailing 900 seconds.",
                      "error_code": "no_data_rate_limit_exceeded",
                      "request_id": "req_01JEXAMPLE",
                      "quota_scope": "no_data",
                      "quota_limit_type": "ratio",
                      "quota_limit": 80,
                      "quota_window_seconds": 900,
                      "block_reason": "no_data_rate_exceeded",
                      "blocked_until_utc": "2026-07-30T15:05:00+00:00",
                      "evaluated_requests": 201,
                      "no_data_requests": 163,
                      "no_data_rate_percent": 81.09
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server-side failure occurred. Body is ProblemDetails with error_code=internal_server_error and the request_id used for support correlation.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "internal_server_error": {
                    "summary": "Unexpected server-side failure",
                    "value": {
                      "type": "https://developer.aso.dev/errors/internal_server_error",
                      "title": "Internal server error",
                      "status": 500,
                      "detail": "An unexpected error occurred while processing the request.",
                      "error_code": "internal_server_error",
                      "request_id": "req_01JEXAMPLE"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Credit ledger or request-accounting storage is temporarily unavailable. Body is ProblemDetails with error_code=credit_ledger_unavailable or public_api_storage_unavailable."
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ],
        "x-aso-pricing": {
          "currency": "credits",
          "billing_unit": "request",
          "cost": "1 credit per successful request",
          "formula": "1",
          "minimum_credits": 1,
          "dry_run_supported": true,
          "dry_run_parameter": "dry_run"
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AgeBand": {
        "type": "object",
        "properties": {
          "minAge": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "maxAge": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppChartAppMeta": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "bundle_id": {
            "type": "string",
            "nullable": true
          },
          "rating_count": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "rating_count_list": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "release_date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "developer_name": {
            "type": "string",
            "nullable": true
          },
          "version": {
            "type": "string",
            "nullable": true
          },
          "price": {
            "type": "string",
            "nullable": true
          },
          "has_in_app_purchases": {
            "type": "boolean",
            "nullable": true
          },
          "in_app_purchases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppChartInAppPurchase"
            },
            "nullable": true
          },
          "age_rating": {
            "type": "string",
            "nullable": true
          },
          "website": {
            "type": "string",
            "nullable": true
          },
          "support_url": {
            "type": "string",
            "nullable": true
          },
          "privacy_policy_url": {
            "type": "string",
            "nullable": true
          },
          "copyright": {
            "type": "string",
            "nullable": true
          },
          "date_check_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppChartInAppPurchase": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "price": {
            "type": "string",
            "nullable": true
          },
          "currency": {
            "type": "string",
            "nullable": true
          },
          "is_subscription": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppChartIncluded": {
        "type": "object",
        "properties": {
          "app_meta": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/AppChartAppMeta"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppChartItem": {
        "required": [
          "app_id",
          "category",
          "category_id",
          "country",
          "date",
          "platform",
          "rank",
          "type"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "platform": {
            "$ref": "#/components/schemas/AppRankingPlatform"
          },
          "type": {
            "$ref": "#/components/schemas/AppRankingType"
          },
          "category_id": {
            "type": "integer",
            "format": "int32"
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "rank": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "AppChartLiveRequest": {
        "required": [
          "category_id",
          "country",
          "platform",
          "type"
        ],
        "type": "object",
        "properties": {
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Supported two-letter App Store country code."
          },
          "lang": {
            "type": "string",
            "description": "Optional Apple language tag. It is sent to Apple for live charts and metadata enrichment; stored chart positions are country-scoped.",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/AppRankingPlatform"
          },
          "type": {
            "$ref": "#/components/schemas/AppRankingType"
          },
          "category_id": {
            "type": "integer",
            "description": "App Store category id. Use GET /v1/dictionaries/app-categories.",
            "format": "int32"
          },
          "limit": {
            "maximum": 500,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of chart rows returned. Default is 500, maximum is 500.",
            "format": "int32",
            "default": 500,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of chart rows to skip.",
            "format": "int32",
            "default": 0,
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppChartQueryRequest": {
        "required": [
          "category_id",
          "country",
          "platform",
          "type"
        ],
        "type": "object",
        "properties": {
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Supported two-letter App Store country code."
          },
          "lang": {
            "type": "string",
            "description": "Optional Apple language tag. It is sent to Apple for live charts and metadata enrichment; stored chart positions are country-scoped.",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/AppRankingPlatform"
          },
          "type": {
            "$ref": "#/components/schemas/AppRankingType"
          },
          "category_id": {
            "type": "integer",
            "description": "App Store category id. Use GET /v1/dictionaries/app-categories.",
            "format": "int32"
          },
          "limit": {
            "maximum": 500,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of chart rows returned. Default is 500, maximum is 500.",
            "format": "int32",
            "default": 500,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of chart rows to skip.",
            "format": "int32",
            "default": 0,
            "nullable": true
          },
          "date": {
            "type": "string",
            "description": "Daily ranking snapshot date. When omitted, the latest available daily snapshot is returned. Earliest supported date is 2024-09-15.",
            "format": "date",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppChartQueryResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppChartItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "AppChartWithMetaQueryRequest": {
        "required": [
          "category_id",
          "country",
          "platform",
          "type"
        ],
        "type": "object",
        "properties": {
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Supported two-letter App Store country code."
          },
          "lang": {
            "type": "string",
            "description": "Optional Apple language tag. It is sent to Apple for live charts and metadata enrichment; stored chart positions are country-scoped.",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/AppRankingPlatform"
          },
          "type": {
            "$ref": "#/components/schemas/AppRankingType"
          },
          "category_id": {
            "type": "integer",
            "description": "App Store category id. Use GET /v1/dictionaries/app-categories.",
            "format": "int32"
          },
          "limit": {
            "maximum": 500,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of chart rows returned. Default is 500, maximum is 500.",
            "format": "int32",
            "default": 500,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of chart rows to skip.",
            "format": "int32",
            "default": 0,
            "nullable": true
          },
          "date": {
            "type": "string",
            "description": "Daily ranking snapshot date. When omitted, the latest available daily snapshot is returned. Earliest supported date is 2024-09-15.",
            "format": "date",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppChartWithMetaQueryResponse": {
        "required": [
          "included",
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppChartItem"
            },
            "nullable": true
          },
          "included": {
            "$ref": "#/components/schemas/AppChartIncluded"
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "AppDetailByStore": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "href": {
            "type": "string",
            "nullable": true
          },
          "attributes": {
            "$ref": "#/components/schemas/AttributesApp"
          },
          "last_version": {
            "$ref": "#/components/schemas/VersionHistoryApp"
          },
          "release_date_last": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "readOnly": true
          },
          "release_date_first": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "readOnly": true
          },
          "release_date": {
            "type": "string",
            "nullable": true,
            "readOnly": true,
            "deprecated": true
          },
          "relationships": {
            "$ref": "#/components/schemas/RelationshipsApp"
          }
        },
        "additionalProperties": false
      },
      "AppDetailsLiveRequest": {
        "required": [
          "app_id",
          "country"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. A leading id prefix or App Store URL is allowed."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code."
          },
          "lang": {
            "type": "string",
            "description": "Optional App Store locale/language, for example en, en-US, or ru.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppDetailsQueryRequest": {
        "required": [
          "app_id",
          "country"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. A leading id prefix or App Store URL is allowed."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code."
          },
          "lang": {
            "type": "string",
            "description": "Optional App Store locale/language, for example en, en-US, or ru.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppDetailsResponse": {
        "required": [
          "data",
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/AppDetailByStore"
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "AppEventAttributes": {
        "type": "object",
        "properties": {
          "productArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "deepLink": {
            "type": "string",
            "nullable": true
          },
          "endDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "$ref": "#/components/schemas/Description"
          },
          "promotionStartDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lockupArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "badgeKind": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "lockupVideo": {
            "$ref": "#/components/schemas/VideoPreviewApp"
          },
          "productVideo": {
            "$ref": "#/components/schemas/VideoPreviewApp"
          }
        },
        "additionalProperties": false
      },
      "AppEventDatum": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "href": {
            "type": "string",
            "nullable": true
          },
          "attributes": {
            "$ref": "#/components/schemas/AppEventAttributes"
          }
        },
        "additionalProperties": false
      },
      "AppEvents": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string",
            "nullable": true
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppEventDatum"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppRankingItem": {
        "required": [
          "app_id",
          "country",
          "date",
          "platform",
          "rank",
          "type"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "platform": {
            "$ref": "#/components/schemas/AppRankingPlatform"
          },
          "type": {
            "$ref": "#/components/schemas/AppRankingType"
          },
          "category_id": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "rank": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "AppRankingPlatform": {
        "enum": [
          "ios",
          "ipad",
          "mac"
        ],
        "type": "string"
      },
      "AppRankingType": {
        "enum": [
          "free",
          "paid",
          "grossing"
        ],
        "type": "string"
      },
      "AppRankingsCurrentRequest": {
        "required": [
          "app_id",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. A leading id prefix or App Store URL is allowed."
          },
          "platform": {
            "$ref": "#/components/schemas/AppRankingPlatform"
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Optional App Store country codes. When omitted, rankings from all stored countries may be returned.",
            "nullable": true
          },
          "types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppRankingType"
            },
            "description": "Optional ranking types. Supported values are free, paid, and grossing.",
            "nullable": true
          },
          "category_ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Optional App Store category ids, for example 6014 for Games or 7012 for Puzzle.",
            "nullable": true
          },
          "limit": {
            "maximum": 1000,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of ranking rows returned. Default is 100, maximum is 1000.",
            "format": "int32",
            "default": 100,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of ranking rows to skip.",
            "format": "int32",
            "default": 0,
            "nullable": true
          },
          "date": {
            "type": "string",
            "description": "Ranking snapshot date. When omitted, the latest available daily snapshot is returned. Earliest supported date is 2024-09-15.",
            "format": "date",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppRankingsHistoryRequest": {
        "required": [
          "app_id",
          "date_from",
          "date_to",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. A leading id prefix or App Store URL is allowed."
          },
          "platform": {
            "$ref": "#/components/schemas/AppRankingPlatform"
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Optional App Store country codes. When omitted, rankings from all stored countries may be returned.",
            "nullable": true
          },
          "types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppRankingType"
            },
            "description": "Optional ranking types. Supported values are free, paid, and grossing.",
            "nullable": true
          },
          "category_ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Optional App Store category ids, for example 6014 for Games or 7012 for Puzzle.",
            "nullable": true
          },
          "limit": {
            "maximum": 1000,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of ranking rows returned. Default is 100, maximum is 1000.",
            "format": "int32",
            "default": 100,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of ranking rows to skip.",
            "format": "int32",
            "default": 0,
            "nullable": true
          },
          "date_from": {
            "type": "string",
            "description": "Start ranking date, inclusive. Required. Earliest supported date is 2024-09-15.",
            "format": "date"
          },
          "date_to": {
            "type": "string",
            "description": "End ranking date, inclusive. Required. Maximum range is 180 days.",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "AppRankingsResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppRankingItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "AppReviewDeveloperResponse": {
        "type": "object",
        "properties": {
          "body": {
            "type": "string",
            "nullable": true
          },
          "modified_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppReviewItem": {
        "required": [
          "app_id",
          "country",
          "date_utc",
          "rating",
          "review_id"
        ],
        "type": "object",
        "properties": {
          "review_id": {
            "type": "string",
            "nullable": true
          },
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "date_utc": {
            "type": "string",
            "format": "date-time"
          },
          "rating": {
            "type": "integer",
            "format": "int32"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "content": {
            "type": "string",
            "nullable": true
          },
          "author_name": {
            "type": "string",
            "nullable": true
          },
          "version": {
            "type": "string",
            "nullable": true
          },
          "vote_count": {
            "type": "integer",
            "format": "int32"
          },
          "developer_response": {
            "$ref": "#/components/schemas/AppReviewDeveloperResponse"
          }
        },
        "additionalProperties": false
      },
      "AppReviewsQueryRequest": {
        "required": [
          "app_id"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. A leading id prefix or App Store URL is allowed."
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Optional App Store country codes. When omitted, reviews from all stored countries may be returned.",
            "nullable": true
          },
          "ratings": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Optional star ratings to include. Allowed values are 1 through 5.",
            "nullable": true
          },
          "versions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Optional app versions to include.",
            "nullable": true
          },
          "keyword": {
            "type": "string",
            "description": "Optional full-text filter applied to review title and body.",
            "nullable": true
          },
          "has_reply": {
            "type": "boolean",
            "description": "Optional developer reply filter.",
            "nullable": true
          },
          "date_from": {
            "type": "string",
            "description": "Start review date, inclusive.",
            "format": "date",
            "nullable": true
          },
          "date_to": {
            "type": "string",
            "description": "End review date, inclusive.",
            "format": "date",
            "nullable": true
          },
          "limit": {
            "maximum": 10000,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of reviews returned. Default is 100, maximum is 10000.",
            "format": "int32",
            "default": 100,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of reviews to skip.",
            "format": "int32",
            "default": 0,
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AppReviewsQueryResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AppReviewItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "AppStoreChart": {
        "type": "object",
        "properties": {
          "position": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "genreName": {
            "type": "string",
            "nullable": true
          },
          "genre": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "chart": {
            "type": "string",
            "nullable": true
          },
          "genreShortName": {
            "type": "string",
            "nullable": true
          },
          "chartLink": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Artwork": {
        "type": "object",
        "properties": {
          "width": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "height": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "original_url": {
            "type": "string",
            "nullable": true
          },
          "iconUrl": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "imageUrl": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "bgColor": {
            "type": "string",
            "nullable": true
          },
          "textColor1": {
            "type": "string",
            "nullable": true
          },
          "textColor2": {
            "type": "string",
            "nullable": true
          },
          "textColor3": {
            "type": "string",
            "nullable": true
          },
          "textColor4": {
            "type": "string",
            "nullable": true
          },
          "hasAlpha": {
            "type": "boolean"
          },
          "hasP3": {
            "type": "boolean"
          },
          "supportsLayeredImage": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "AssetApp": {
        "type": "object",
        "properties": {
          "flavor": {
            "type": "string",
            "nullable": true
          },
          "size": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AttributesApp": {
        "type": "object",
        "properties": {
          "supportsArcade": {
            "type": "boolean"
          },
          "isFirstPartyHideableApp": {
            "type": "boolean"
          },
          "contentRatingsBySystem": {
            "$ref": "#/components/schemas/ContentRatingsBySystem"
          },
          "deviceFamilies": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "supportsStreamlinedBuy": {
            "type": "boolean"
          },
          "usesExternalPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "usesExternalLinkPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "remoteControllerRequirement": {
            "type": "string",
            "nullable": true
          },
          "chartPositions": {
            "$ref": "#/components/schemas/ChartPositions"
          },
          "userRating": {
            "$ref": "#/components/schemas/UserRating"
          },
          "firstVersionSupportingInAppPurchaseApi": {
            "type": "string",
            "nullable": true
          },
          "iads": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "genreDisplayName": {
            "type": "string",
            "nullable": true
          },
          "isPreorder": {
            "type": "boolean"
          },
          "artistName": {
            "type": "string",
            "nullable": true
          },
          "isIOSBinaryMacOSCompatible": {
            "type": "boolean"
          },
          "reviewsRestricted": {
            "type": "boolean"
          },
          "platformAttributes": {
            "$ref": "#/components/schemas/PlatformAttributesByStore"
          },
          "distributionKind": {
            "type": "string",
            "nullable": true
          },
          "familyShareEnabledDate": {
            "type": "string",
            "nullable": true
          },
          "privacy": {
            "$ref": "#/components/schemas/PrivacyByStore"
          },
          "usesLocationBackgroundMode": {
            "type": "boolean",
            "nullable": true
          },
          "sellerLabel": {
            "type": "string",
            "nullable": true
          },
          "requirementsByDeviceFamily": {
            "$ref": "#/components/schemas/RequirementsByDeviceFamily"
          },
          "hasEula": {
            "type": "boolean",
            "nullable": true
          },
          "fileSizeByDevice": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int64"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AuthClientResponse": {
        "required": [
          "id",
          "name",
          "role"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public API key identifier.",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Public API client display name.",
            "nullable": true
          },
          "role": {
            "type": "string",
            "description": "Public API client role.",
            "nullable": true
          },
          "email": {
            "type": "string",
            "description": "Email attached to the authenticated API key.",
            "nullable": true
          },
          "partner_id": {
            "type": "string",
            "description": "Partner identifier when the key belongs to a partner.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Authenticated public API client information."
      },
      "AuthTestResponse": {
        "required": [
          "client",
          "meta",
          "surface"
        ],
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "Current endpoint status.",
            "nullable": true
          },
          "surface": {
            "type": "string",
            "description": "Active public API surface.",
            "nullable": true
          },
          "api_version": {
            "type": "string",
            "description": "Public API version served by this endpoint.",
            "nullable": true
          },
          "client": {
            "$ref": "#/components/schemas/AuthClientResponse"
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false,
        "description": "Response returned by the public API smoke/auth test endpoint."
      },
      "ChartPositions": {
        "type": "object",
        "properties": {
          "appStore": {
            "$ref": "#/components/schemas/AppStoreChart"
          },
          "messages": {
            "$ref": "#/components/schemas/AppStoreChart"
          }
        },
        "additionalProperties": false
      },
      "ContentRating": {
        "type": "object",
        "properties": {
          "system": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "integer",
            "format": "int64"
          },
          "rank": {
            "type": "integer",
            "format": "int64"
          },
          "advisories": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ContentRatingsBySystem": {
        "type": "object",
        "properties": {
          "appsApple": {
            "$ref": "#/components/schemas/ContentRating"
          }
        },
        "additionalProperties": false
      },
      "CustomAttributesDataByStore": {
        "type": "object",
        "properties": {
          "customArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "customVideoPreviewsByType": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/VideoPreviewApp"
              }
            },
            "nullable": true
          },
          "customVideoPreviewsByTypeForAd": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/VideoPreviewApp"
              }
            },
            "nullable": true
          },
          "customPromotionalText": {
            "type": "string",
            "nullable": true
          },
          "customScreenshotsByType": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Artwork"
              }
            },
            "nullable": true
          },
          "customScreenshotsByTypeForAd": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Artwork"
              }
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DataCategory": {
        "type": "object",
        "properties": {
          "dataCategory": {
            "type": "string",
            "nullable": true
          },
          "identifier": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Description": {
        "type": "object",
        "properties": {
          "standard": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Developer": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string",
            "nullable": true
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DeveloperDatum"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DeveloperAttributes": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "mediaType": {
            "type": "string",
            "nullable": true
          },
          "genreNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "editorialArtwork": {
            "$ref": "#/components/schemas/EditorialArtwork"
          },
          "url": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DeveloperDatum": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "href": {
            "type": "string",
            "nullable": true
          },
          "attributes": {
            "$ref": "#/components/schemas/DeveloperAttributes"
          }
        },
        "additionalProperties": false
      },
      "DeviceRequirement": {
        "type": "object",
        "properties": {
          "deviceFamily": {
            "type": "string",
            "nullable": true
          },
          "requirementString": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DiscountApp": {
        "type": "object",
        "properties": {
          "modeType": {
            "type": "string",
            "nullable": true
          },
          "numOfPeriods": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "priceFormatted": {
            "type": "string",
            "nullable": true
          },
          "priceString": {
            "type": "string",
            "nullable": true
          },
          "recurringSubscriptionPeriod": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EditorialArtwork": {
        "type": "object",
        "properties": {
          "contentIconTrimmedMonochrome": {
            "$ref": "#/components/schemas/Artwork"
          },
          "contentIconTrimmed": {
            "$ref": "#/components/schemas/Artwork"
          },
          "brandLogo": {
            "$ref": "#/components/schemas/Artwork"
          },
          "bannerUber": {
            "$ref": "#/components/schemas/Artwork"
          },
          "storeFlowcase": {
            "$ref": "#/components/schemas/Artwork"
          },
          "contentLogoTrimmed": {
            "$ref": "#/components/schemas/Artwork"
          },
          "contentLogo": {
            "$ref": "#/components/schemas/Artwork"
          },
          "subscriptionHero": {
            "$ref": "#/components/schemas/Artwork"
          },
          "fullscreenBackground": {
            "$ref": "#/components/schemas/Artwork"
          },
          "originalFlowcaseBrick": {
            "$ref": "#/components/schemas/Artwork"
          },
          "crossoverCard": {
            "$ref": "#/components/schemas/Artwork"
          },
          "splashFullScreen": {
            "$ref": "#/components/schemas/Artwork"
          }
        },
        "additionalProperties": false
      },
      "EditorialBadgeInfo": {
        "type": "object",
        "properties": {
          "editorialBadgeType": {
            "type": "string",
            "nullable": true
          },
          "nameForDisplay": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EditorialNotes": {
        "type": "object",
        "properties": {
          "short": {
            "type": "string",
            "nullable": true
          },
          "tagline": {
            "type": "string",
            "nullable": true
          },
          "standard": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenderAttributes": {
        "type": "object",
        "properties": {
          "parentName": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "parentId": {
            "type": "string",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Genres": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string",
            "nullable": true
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GenresDatum"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GenresDatum": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "href": {
            "type": "string",
            "nullable": true
          },
          "attributes": {
            "$ref": "#/components/schemas/GenderAttributes"
          }
        },
        "additionalProperties": false
      },
      "InAppAttributes": {
        "type": "object",
        "properties": {
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfferApp"
            },
            "nullable": true
          },
          "subscriptionFamilyRank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "subscriptionFamilyName": {
            "type": "string",
            "nullable": true
          },
          "offerName": {
            "type": "string",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "isMerchandisedEnabled": {
            "type": "boolean",
            "nullable": true
          },
          "description": {
            "$ref": "#/components/schemas/Description"
          },
          "subscriptionFamilyId": {
            "type": "string",
            "nullable": true
          },
          "icuLocale": {
            "type": "string",
            "nullable": true
          },
          "url": {
            "type": "string",
            "nullable": true
          },
          "isSubscription": {
            "type": "boolean",
            "nullable": true
          },
          "isMerchandisedVisibleByDefault": {
            "type": "boolean",
            "nullable": true
          },
          "isFamilyShareable": {
            "type": "boolean",
            "nullable": true
          },
          "editorialArtwork": {
            "$ref": "#/components/schemas/EditorialArtwork"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "InAppData": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "href": {
            "type": "string",
            "nullable": true
          },
          "attributes": {
            "$ref": "#/components/schemas/InAppAttributes"
          }
        },
        "additionalProperties": false
      },
      "IosAttributes": {
        "type": "object",
        "properties": {
          "seller": {
            "type": "string",
            "nullable": true
          },
          "copyright": {
            "type": "string",
            "nullable": true
          },
          "ovalArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "ageBand": {
            "$ref": "#/components/schemas/AgeBand"
          },
          "circularArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "editorialBadgeInfo": {
            "$ref": "#/components/schemas/EditorialBadgeInfo"
          },
          "minimumMacOSVersion": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "$ref": "#/components/schemas/Description"
          },
          "isStandaloneWithCompanionForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "is32bitOnly": {
            "type": "boolean",
            "nullable": true
          },
          "isAppleWatchSupported": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilitiesForRealityDevice": {
            "type": "string",
            "nullable": true
          },
          "websiteUrl": {
            "type": "string",
            "nullable": true
          },
          "versionHistory": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VersionHistoryApp"
            },
            "nullable": true
          },
          "isXROSCompatible": {
            "type": "boolean",
            "nullable": true
          },
          "minimumXROSVersion": {
            "type": "string",
            "nullable": true
          },
          "languageList": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "hasSafariExtension": {
            "type": "boolean",
            "nullable": true
          },
          "editorialNotes": {
            "$ref": "#/components/schemas/EditorialNotes"
          },
          "messagesScreenshots": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Artwork"
              }
            },
            "nullable": true
          },
          "requiresGameController": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilities": {
            "type": "string",
            "nullable": true
          },
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfferApp"
            },
            "nullable": true
          },
          "supportedLocales": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportedLocale"
            },
            "nullable": true
          },
          "requires32bit": {
            "type": "boolean",
            "nullable": true
          },
          "isGameCenterEnabled": {
            "type": "boolean",
            "nullable": true
          },
          "isSiriSupported": {
            "type": "boolean",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "minimumOSVersion": {
            "type": "string",
            "nullable": true
          },
          "hasInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "bundleId": {
            "type": "string",
            "nullable": true
          },
          "hasMessagesExtension": {
            "type": "boolean",
            "nullable": true
          },
          "artwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "supportsGameController": {
            "type": "boolean",
            "nullable": true
          },
          "privacyPolicyUrl": {
            "type": "string",
            "nullable": true
          },
          "videoPreviewsByType": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/VideoPreviewApp"
              },
              "nullable": true
            },
            "nullable": true
          },
          "hasFamilyShareableInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "supportURLForLanguage": {
            "type": "string",
            "nullable": true
          },
          "isStandaloneForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "isHiddenFromSpringboard": {
            "type": "boolean",
            "nullable": true
          },
          "isDeliveredInIOSAppForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "hasPrivacyPolicyText": {
            "type": "boolean",
            "nullable": true
          },
          "editorialArtwork": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Artwork"
            },
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "supportsPassbook": {
            "type": "boolean",
            "nullable": true
          },
          "requirementsString": {
            "type": "string",
            "nullable": true
          },
          "externalVersionId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "customAttributes": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/components/schemas/CustomAttributesDataByStore"
              }
            },
            "nullable": true
          },
          "usesExternalPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "usesExternalLinkPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "remoteControllerRequirement": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordLiveSearchItem": {
        "required": [
          "country",
          "keyword",
          "platform"
        ],
        "type": "object",
        "properties": {
          "keyword": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "rank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordLiveSearchResultItem"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordLiveSearchRequest": {
        "required": [
          "country",
          "keyword",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "description": "App Store app id. Optional. When omitted, the response returns the full live organic result page.",
            "nullable": true
          },
          "keyword": {
            "minLength": 1,
            "type": "string",
            "description": "Keyword term. Required."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          }
        },
        "additionalProperties": false
      },
      "KeywordLiveSearchResponse": {
        "required": [
          "data",
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/KeywordLiveSearchItem"
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "KeywordLiveSearchResultItem": {
        "required": [
          "app_id"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "rank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingCurrentItem": {
        "required": [
          "date",
          "keyword"
        ],
        "type": "object",
        "properties": {
          "keyword": {
            "type": "string",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "rank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingHistoryItem": {
        "required": [
          "app_id",
          "date",
          "keyword"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "keyword": {
            "type": "string",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "rank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingLiveAppItem": {
        "required": [
          "app_id"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "rank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingLiveItem": {
        "required": [
          "country",
          "platform",
          "term"
        ],
        "type": "object",
        "properties": {
          "term": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "last_updated": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "apps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordRankingLiveAppItem"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingLivePlatform": {
        "enum": [
          "ios"
        ],
        "type": "string"
      },
      "KeywordRankingLiveResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordRankingLiveItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingsCurrentRequest": {
        "required": [
          "app_id",
          "country",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. Required. Values may include or omit the leading id prefix."
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Keyword terms. Optional, maximum 100 normalized keywords. When omitted, returns stored keyword-date rows for yesterday and today using cursor pagination.",
            "nullable": true
          },
          "limit": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of keyword-date rows returned when keywords is omitted. Default is 10. Use 0 to return all stored yesterday/today keyword-date rows.",
            "format": "int32",
            "default": 10,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of keyword-date rows to skip when keywords is omitted. Requires cursor_id when greater than 0.",
            "format": "int32",
            "default": 0,
            "nullable": true
          },
          "cursor_id": {
            "type": "string",
            "description": "Cursor id from meta.pagination.cursor_id. Required when offset is greater than 0.",
            "nullable": true
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingsCurrentResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordRankingCurrentItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingsHistoryRequest": {
        "required": [
          "app_ids",
          "country",
          "date_from",
          "date_to",
          "keywords",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_ids": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "App Store app ids. Required, maximum 5 normalized app ids."
          },
          "keywords": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Keyword terms. Required, maximum 100 normalized keywords."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "date_from": {
            "type": "string",
            "description": "Start date, inclusive. Required.",
            "format": "date"
          },
          "date_to": {
            "type": "string",
            "description": "End date, inclusive. Required. Must be greater than or equal to date_from; maximum range is 60 days.",
            "format": "date"
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingsHistoryResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordRankingHistoryItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "KeywordRankingsLiveRequest": {
        "required": [
          "country",
          "keywords",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "description": "Legacy app scope field. It does not affect returned live rankings; the response contains top organic apps only.",
            "nullable": true
          },
          "country": {
            "maxLength": 2,
            "minLength": 2,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "keywords": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Keyword terms. Required, at least one normalized keyword."
          },
          "limit": {
            "maximum": 10,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of app rows returned per keyword. Defaults to 10, maximum 10.",
            "format": "int32",
            "default": 10,
            "nullable": true
          },
          "offset": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "description": "Number of app rows to skip per keyword. Requires request_id when greater than 0.",
            "format": "int32",
            "default": 0,
            "nullable": true
          },
          "request_id": {
            "type": "string",
            "description": "Original first-page request id. Required when offset is greater than 0.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordSearchQueryRequest": {
        "required": [
          "country",
          "keyword",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "type": "string",
            "description": "App Store app id. Optional. When omitted, the response returns the latest stored organic result page.",
            "nullable": true
          },
          "keyword": {
            "minLength": 1,
            "type": "string",
            "description": "Keyword term. Required."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingDeleteResponse": {
        "required": [
          "data",
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/KeywordsTrackingDeleteResult"
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingDeleteResult": {
        "required": [
          "tracking_id"
        ],
        "type": "object",
        "properties": {
          "tracking_id": {
            "type": "string",
            "nullable": true
          },
          "deleted": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingItem": {
        "required": [
          "app_id",
          "country",
          "keyword",
          "platform",
          "project_id",
          "tracking_id"
        ],
        "type": "object",
        "properties": {
          "tracking_id": {
            "type": "string",
            "nullable": true
          },
          "project_id": {
            "type": "string",
            "nullable": true
          },
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "keyword": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "updated_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingListRequest": {
        "required": [
          "app_id",
          "country",
          "platform",
          "project_id"
        ],
        "type": "object",
        "properties": {
          "project_id": {
            "minLength": 1,
            "type": "string",
            "description": "ASO.dev project id. Required."
          },
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. Required. Values may include or omit the leading id prefix."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "page": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "description": "One-based page number. Optional, defaults to 1.",
            "format": "int32",
            "default": 1,
            "nullable": true
          },
          "page_size": {
            "maximum": 200,
            "minimum": 1,
            "type": "integer",
            "description": "Page size. Optional, defaults to 50, maximum 200.",
            "format": "int32",
            "default": 50,
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingListResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordsTrackingItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingMutationResponse": {
        "required": [
          "data",
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/KeywordsTrackingMutationResult"
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingMutationResult": {
        "required": [
          "app_id",
          "country",
          "platform",
          "project_id"
        ],
        "type": "object",
        "properties": {
          "project_id": {
            "type": "string",
            "nullable": true
          },
          "app_id": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "added": {
            "type": "integer",
            "format": "int32"
          },
          "removed": {
            "type": "integer",
            "format": "int32"
          },
          "total": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingPatchRequest": {
        "required": [
          "app_id",
          "country",
          "platform",
          "project_id"
        ],
        "type": "object",
        "properties": {
          "project_id": {
            "minLength": 1,
            "type": "string",
            "description": "ASO.dev project id. Required."
          },
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. Required. Values may include or omit the leading id prefix."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "add_keywords": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Keyword terms to add. Optional, but at least one add_keywords or remove_keywords value is required.",
            "nullable": true
          },
          "remove_keywords": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Keyword terms to remove. Optional, but at least one add_keywords or remove_keywords value is required.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingPutRequest": {
        "required": [
          "app_id",
          "country",
          "keywords",
          "platform",
          "project_id"
        ],
        "type": "object",
        "properties": {
          "project_id": {
            "minLength": 1,
            "type": "string",
            "description": "ASO.dev project id. Required."
          },
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. Required. Values may include or omit the leading id prefix."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "keywords": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Replacement tracked keyword terms. Required, 1 to 200 normalized keywords."
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingRankingsRequest": {
        "required": [
          "app_id",
          "country",
          "keywords",
          "platform"
        ],
        "type": "object",
        "properties": {
          "app_id": {
            "minLength": 1,
            "type": "string",
            "description": "App Store app id. Required. Values may include or omit the leading id prefix."
          },
          "keywords": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Keyword terms. Required, maximum 100 normalized keywords."
          },
          "country": {
            "minLength": 1,
            "type": "string",
            "description": "Two-letter App Store country code. Required."
          },
          "platform": {
            "$ref": "#/components/schemas/KeywordRankingLivePlatform"
          },
          "date_from": {
            "type": "string",
            "description": "Start date, inclusive. Optional. Omit both date_from and date_to to return the latest stored value.",
            "format": "date",
            "nullable": true
          },
          "date_to": {
            "type": "string",
            "description": "End date, inclusive. Optional. Must be provided with date_from and be greater than or equal to date_from.",
            "format": "date",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KeywordsTrackingRankingsResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordRankingHistoryItem"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "MacAppAttributes": {
        "type": "object",
        "properties": {
          "seller": {
            "type": "string",
            "nullable": true
          },
          "copyright": {
            "type": "string",
            "nullable": true
          },
          "ovalArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "ageBand": {
            "$ref": "#/components/schemas/AgeBand"
          },
          "circularArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "editorialBadgeInfo": {
            "$ref": "#/components/schemas/EditorialBadgeInfo"
          },
          "minimumMacOSVersion": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "$ref": "#/components/schemas/Description"
          },
          "isStandaloneWithCompanionForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "is32bitOnly": {
            "type": "boolean",
            "nullable": true
          },
          "isAppleWatchSupported": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilitiesForRealityDevice": {
            "type": "string",
            "nullable": true
          },
          "websiteUrl": {
            "type": "string",
            "nullable": true
          },
          "versionHistory": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VersionHistoryApp"
            },
            "nullable": true
          },
          "isXROSCompatible": {
            "type": "boolean",
            "nullable": true
          },
          "minimumXROSVersion": {
            "type": "string",
            "nullable": true
          },
          "languageList": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "hasSafariExtension": {
            "type": "boolean",
            "nullable": true
          },
          "editorialNotes": {
            "$ref": "#/components/schemas/EditorialNotes"
          },
          "messagesScreenshots": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Artwork"
              }
            },
            "nullable": true
          },
          "requiresGameController": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilities": {
            "type": "string",
            "nullable": true
          },
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfferApp"
            },
            "nullable": true
          },
          "supportedLocales": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportedLocale"
            },
            "nullable": true
          },
          "requires32bit": {
            "type": "boolean",
            "nullable": true
          },
          "isGameCenterEnabled": {
            "type": "boolean",
            "nullable": true
          },
          "isSiriSupported": {
            "type": "boolean",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "minimumOSVersion": {
            "type": "string",
            "nullable": true
          },
          "hasInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "bundleId": {
            "type": "string",
            "nullable": true
          },
          "hasMessagesExtension": {
            "type": "boolean",
            "nullable": true
          },
          "artwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "supportsGameController": {
            "type": "boolean",
            "nullable": true
          },
          "privacyPolicyUrl": {
            "type": "string",
            "nullable": true
          },
          "videoPreviewsByType": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/VideoPreviewApp"
              },
              "nullable": true
            },
            "nullable": true
          },
          "hasFamilyShareableInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "supportURLForLanguage": {
            "type": "string",
            "nullable": true
          },
          "isStandaloneForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "isHiddenFromSpringboard": {
            "type": "boolean",
            "nullable": true
          },
          "isDeliveredInIOSAppForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "hasPrivacyPolicyText": {
            "type": "boolean",
            "nullable": true
          },
          "editorialArtwork": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Artwork"
            },
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "supportsPassbook": {
            "type": "boolean",
            "nullable": true
          },
          "requirementsString": {
            "type": "string",
            "nullable": true
          },
          "externalVersionId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "customAttributes": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/components/schemas/CustomAttributesDataByStore"
              }
            },
            "nullable": true
          },
          "usesExternalPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "usesExternalLinkPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "remoteControllerRequirement": {
            "type": "string",
            "nullable": true
          },
          "runsOnAppleSilicon": {
            "type": "boolean",
            "nullable": true
          },
          "requiresRosetta": {
            "type": "boolean",
            "nullable": true
          },
          "preflightPackageUrl": {
            "type": "string",
            "nullable": true
          },
          "runsOnIntel": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MerchandisedInApps": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string",
            "nullable": true
          },
          "next": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "OfferApp": {
        "type": "object",
        "properties": {
          "buyParams": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "priceFormatted": {
            "type": "string",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "currencyCode": {
            "type": "string",
            "nullable": true
          },
          "discounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DiscountApp"
            },
            "nullable": true
          },
          "assets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetApp"
            },
            "nullable": true
          },
          "recurringSubscriptionPeriod": {
            "type": "string",
            "nullable": true
          },
          "subscriptionFamilyRank": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "subscriptionFamilyName": {
            "type": "string",
            "nullable": true
          },
          "offerName": {
            "type": "string",
            "nullable": true
          },
          "isSubscription": {
            "type": "boolean",
            "nullable": true
          },
          "isMerchandisedVisibleByDefault": {
            "type": "boolean",
            "nullable": true
          },
          "isFamilyShareable": {
            "type": "boolean",
            "nullable": true
          },
          "editorialArtwork": {
            "$ref": "#/components/schemas/EditorialArtwork"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "OtherAppsLinks": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string",
            "nullable": true
          },
          "next": {
            "type": "string",
            "nullable": true
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SimpleAppLinks"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PlatformAttributesByStore": {
        "type": "object",
        "properties": {
          "ios": {
            "$ref": "#/components/schemas/IosAttributes"
          },
          "osx": {
            "$ref": "#/components/schemas/MacAppAttributes"
          },
          "appletvos": {
            "$ref": "#/components/schemas/TvOsAttributes"
          },
          "xros": {
            "$ref": "#/components/schemas/XrosAttributes"
          }
        },
        "additionalProperties": false
      },
      "PrivacyByStore": {
        "type": "object",
        "properties": {
          "privacyTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PrivacyTypeByStore"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PrivacyTypeByStore": {
        "type": "object",
        "properties": {
          "privacyType": {
            "type": "string",
            "nullable": true
          },
          "identifier": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "dataCategories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DataCategory"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": { }
      },
      "ProjectListItemResponse": {
        "required": [
          "name",
          "project_id"
        ],
        "type": "object",
        "properties": {
          "project_id": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProjectsListResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProjectListItemResponse"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "PublicApiRateLimitProblemDetails": {
        "required": [
          "detail",
          "error_code",
          "request_id",
          "status",
          "title",
          "type"
        ],
        "type": "object",
        "properties": {
          "type": {
            "minLength": 1,
            "type": "string",
            "description": "Stable URI identifying the error type."
          },
          "title": {
            "minLength": 1,
            "type": "string",
            "description": "Short human-readable error title."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code. Always 429 for this contract.",
            "format": "int32"
          },
          "detail": {
            "minLength": 1,
            "type": "string",
            "description": "Human-readable explanation including the exhausted limit or no-data block."
          },
          "error_code": {
            "minLength": 1,
            "type": "string",
            "description": "Stable machine-readable error code."
          },
          "request_id": {
            "minLength": 1,
            "type": "string",
            "description": "Public request identifier for tracing and support."
          },
          "quota_scope": {
            "type": "string",
            "description": "Exhausted quota scope, such as api, dry_run, no_data, or operation:<operation_id>.",
            "nullable": true
          },
          "quota_limit_type": {
            "type": "string",
            "description": "Exhausted limit type: window, minute, hour, day, month, or ratio.",
            "nullable": true
          },
          "quota_limit": {
            "type": "integer",
            "description": "Numeric limit for the exhausted quota.",
            "format": "int64",
            "nullable": true
          },
          "quota_window_seconds": {
            "type": "integer",
            "description": "Fixed quota or observation window length in seconds.",
            "format": "int32",
            "nullable": true
          },
          "block_reason": {
            "type": "string",
            "description": "Machine-readable reason for a temporary key block.",
            "nullable": true
          },
          "blocked_until_utc": {
            "type": "string",
            "description": "UTC timestamp after which a temporarily blocked key can retry.",
            "format": "date-time",
            "nullable": true
          },
          "evaluated_requests": {
            "type": "integer",
            "description": "Number of successful data requests used to evaluate the no-data ratio.",
            "format": "int64",
            "nullable": true
          },
          "no_data_requests": {
            "type": "integer",
            "description": "Number of no-data responses in the evaluated window.",
            "format": "int64",
            "nullable": true
          },
          "no_data_rate_percent": {
            "type": "number",
            "description": "No-data response rate in percent for the evaluated window.",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "ProblemDetails returned when a Public API request is rejected with HTTP 429."
      },
      "RelationshipsApp": {
        "type": "object",
        "properties": {
          "app-events": {
            "$ref": "#/components/schemas/AppEvents"
          },
          "reviews": {
            "$ref": "#/components/schemas/Reviews"
          },
          "alternate-apps": {
            "$ref": "#/components/schemas/OtherAppsLinks"
          },
          "related-editorial-items": {
            "$ref": "#/components/schemas/OtherAppsLinks"
          },
          "top-in-apps": {
            "$ref": "#/components/schemas/TopInApps"
          },
          "developer-other-apps": {
            "$ref": "#/components/schemas/OtherAppsLinks"
          },
          "customers-also-bought-apps": {
            "$ref": "#/components/schemas/OtherAppsLinks"
          },
          "genres": {
            "$ref": "#/components/schemas/Genres"
          },
          "merchandised-in-apps": {
            "$ref": "#/components/schemas/MerchandisedInApps"
          },
          "developer": {
            "$ref": "#/components/schemas/Developer"
          }
        },
        "additionalProperties": false
      },
      "RequirementsByDeviceFamily": {
        "type": "object",
        "properties": {
          "iphone": {
            "$ref": "#/components/schemas/DeviceRequirement"
          },
          "ipod": {
            "$ref": "#/components/schemas/DeviceRequirement"
          },
          "ipad": {
            "$ref": "#/components/schemas/DeviceRequirement"
          },
          "mac": {
            "$ref": "#/components/schemas/DeviceRequirement"
          },
          "realityDevice": {
            "$ref": "#/components/schemas/DeviceRequirement"
          }
        },
        "additionalProperties": false
      },
      "ResponseMeta": {
        "required": [
          "request_id"
        ],
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "description": "Server-side request identifier. Mirrors X-Request-ID when the client provides it.",
            "nullable": true
          },
          "usage": {
            "$ref": "#/components/schemas/ResponseUsage"
          },
          "pagination": {
            "$ref": "#/components/schemas/ResponsePagination"
          },
          "timestamp_utc": {
            "type": "string",
            "description": "UTC timestamp when the response was produced.",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Common metadata returned by public API responses."
      },
      "ResponsePagination": {
        "type": "object",
        "properties": {
          "cursor_id": {
            "type": "string",
            "description": "Cursor id for fetching later pages from the same saved result set.",
            "nullable": true
          },
          "limit": {
            "type": "integer",
            "description": "Maximum rows returned per page.",
            "format": "int32"
          },
          "offset": {
            "type": "integer",
            "description": "Rows skipped before this page.",
            "format": "int32"
          },
          "total": {
            "type": "integer",
            "description": "Total rows available for the paginated list.",
            "format": "int32"
          },
          "has_more": {
            "type": "boolean",
            "description": "True when another page is available."
          }
        },
        "additionalProperties": false
      },
      "ResponseUsage": {
        "required": [
          "pricing_policy_version",
          "status"
        ],
        "type": "object",
        "properties": {
          "pricing_policy_version": {
            "type": "string",
            "description": "Pricing policy version used to estimate this request.",
            "nullable": true
          },
          "billing_unit": {
            "type": "string",
            "description": "Unit being priced, such as request, keyword, or keyword_country_platform.",
            "nullable": true
          },
          "units": {
            "type": "integer",
            "description": "Count of priced units.",
            "format": "int64"
          },
          "credits_spent": {
            "type": "integer",
            "description": "Operation cost before balance charging rules are applied.",
            "format": "int64"
          },
          "credits_charged": {
            "type": "integer",
            "description": "Credits actually debited from the account balance. Partner calls may be tracked with zero charged credits.",
            "format": "int64"
          },
          "balance_after": {
            "type": "integer",
            "description": "Developer account balance after the charge, when a balance debit happened.",
            "format": "int64",
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "Billing status, such as charged, tracked, dry_run, no_data, not_billable, or duplicate.",
            "nullable": true
          },
          "original_request_id": {
            "type": "string",
            "description": "Original first-page request id for snapshot pages.",
            "nullable": true
          },
          "original_units": {
            "type": "integer",
            "description": "Original first-page priced unit count for snapshot pages.",
            "format": "int64",
            "nullable": true
          },
          "original_credits_spent": {
            "type": "integer",
            "description": "Original first-page operation cost for snapshot pages.",
            "format": "int64",
            "nullable": true
          },
          "original_credits_charged": {
            "type": "integer",
            "description": "Original first-page charged credits for snapshot pages.",
            "format": "int64",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReviewAttributes": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "developerResponse": {
            "$ref": "#/components/schemas/ReviewDeveloperResponse"
          },
          "review": {
            "type": "string",
            "nullable": true
          },
          "rating": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isEdited": {
            "type": "boolean",
            "nullable": true
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReviewDatum": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "attributes": {
            "$ref": "#/components/schemas/ReviewAttributes"
          }
        },
        "additionalProperties": false
      },
      "ReviewDeveloperResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "body": {
            "type": "string",
            "nullable": true
          },
          "modified": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Reviews": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string",
            "nullable": true
          },
          "next": {
            "type": "string",
            "nullable": true
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReviewDatum"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SimpleAppLinks": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "href": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SupportedAppCategoriesResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportedAppCategoryResponse"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "SupportedAppCategoryResponse": {
        "required": [
          "category_id",
          "is_aggregate",
          "name",
          "slug"
        ],
        "type": "object",
        "properties": {
          "category_id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "slug": {
            "type": "string",
            "nullable": true
          },
          "parent_category_id": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "is_aggregate": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SupportedCountriesResponse": {
        "required": [
          "meta"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportedCountryResponse"
            },
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false
      },
      "SupportedCountryResponse": {
        "required": [
          "code"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SupportedLocale": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "tag": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SurfaceTestResponse": {
        "required": [
          "meta",
          "surface"
        ],
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "description": "Current endpoint status.",
            "nullable": true
          },
          "surface": {
            "type": "string",
            "description": "Active public API surface.",
            "nullable": true
          },
          "api_version": {
            "type": "string",
            "description": "Public API version served by this endpoint.",
            "nullable": true
          },
          "meta": {
            "$ref": "#/components/schemas/ResponseMeta"
          }
        },
        "additionalProperties": false,
        "description": "Response returned by surface-specific smoke endpoints."
      },
      "TopInApps": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string",
            "nullable": true
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InAppData"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TvOsAttributes": {
        "type": "object",
        "properties": {
          "seller": {
            "type": "string",
            "nullable": true
          },
          "copyright": {
            "type": "string",
            "nullable": true
          },
          "ovalArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "ageBand": {
            "$ref": "#/components/schemas/AgeBand"
          },
          "circularArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "editorialBadgeInfo": {
            "$ref": "#/components/schemas/EditorialBadgeInfo"
          },
          "minimumMacOSVersion": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "$ref": "#/components/schemas/Description"
          },
          "isStandaloneWithCompanionForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "is32bitOnly": {
            "type": "boolean",
            "nullable": true
          },
          "isAppleWatchSupported": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilitiesForRealityDevice": {
            "type": "string",
            "nullable": true
          },
          "websiteUrl": {
            "type": "string",
            "nullable": true
          },
          "versionHistory": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VersionHistoryApp"
            },
            "nullable": true
          },
          "isXROSCompatible": {
            "type": "boolean",
            "nullable": true
          },
          "minimumXROSVersion": {
            "type": "string",
            "nullable": true
          },
          "languageList": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "hasSafariExtension": {
            "type": "boolean",
            "nullable": true
          },
          "editorialNotes": {
            "$ref": "#/components/schemas/EditorialNotes"
          },
          "messagesScreenshots": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Artwork"
              }
            },
            "nullable": true
          },
          "requiresGameController": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilities": {
            "type": "string",
            "nullable": true
          },
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfferApp"
            },
            "nullable": true
          },
          "supportedLocales": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportedLocale"
            },
            "nullable": true
          },
          "requires32bit": {
            "type": "boolean",
            "nullable": true
          },
          "isGameCenterEnabled": {
            "type": "boolean",
            "nullable": true
          },
          "isSiriSupported": {
            "type": "boolean",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "minimumOSVersion": {
            "type": "string",
            "nullable": true
          },
          "hasInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "bundleId": {
            "type": "string",
            "nullable": true
          },
          "hasMessagesExtension": {
            "type": "boolean",
            "nullable": true
          },
          "artwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "supportsGameController": {
            "type": "boolean",
            "nullable": true
          },
          "privacyPolicyUrl": {
            "type": "string",
            "nullable": true
          },
          "videoPreviewsByType": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/VideoPreviewApp"
              },
              "nullable": true
            },
            "nullable": true
          },
          "hasFamilyShareableInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "supportURLForLanguage": {
            "type": "string",
            "nullable": true
          },
          "isStandaloneForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "isHiddenFromSpringboard": {
            "type": "boolean",
            "nullable": true
          },
          "isDeliveredInIOSAppForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "hasPrivacyPolicyText": {
            "type": "boolean",
            "nullable": true
          },
          "editorialArtwork": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Artwork"
            },
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "supportsPassbook": {
            "type": "boolean",
            "nullable": true
          },
          "requirementsString": {
            "type": "string",
            "nullable": true
          },
          "externalVersionId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "customAttributes": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/components/schemas/CustomAttributesDataByStore"
              }
            },
            "nullable": true
          },
          "usesExternalPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "usesExternalLinkPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "remoteControllerRequirement": {
            "type": "string",
            "nullable": true
          },
          "supportsFunCamera": {
            "type": "boolean",
            "nullable": true
          },
          "maxPlayers": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "minPlayers": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserRating": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ratingCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "ratingCountList": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "ariaLabelForRatings": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VersionHistoryApp": {
        "type": "object",
        "properties": {
          "versionDisplay": {
            "type": "string",
            "nullable": true
          },
          "releaseNotes": {
            "type": "string",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "releaseTimestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VideoPreviewApp": {
        "type": "object",
        "properties": {
          "previewFrame": {
            "$ref": "#/components/schemas/Artwork"
          },
          "video": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "XrosAttributes": {
        "type": "object",
        "properties": {
          "seller": {
            "type": "string",
            "nullable": true
          },
          "copyright": {
            "type": "string",
            "nullable": true
          },
          "ovalArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "ageBand": {
            "$ref": "#/components/schemas/AgeBand"
          },
          "circularArtwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "editorialBadgeInfo": {
            "$ref": "#/components/schemas/EditorialBadgeInfo"
          },
          "minimumMacOSVersion": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "$ref": "#/components/schemas/Description"
          },
          "isStandaloneWithCompanionForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "is32bitOnly": {
            "type": "boolean",
            "nullable": true
          },
          "isAppleWatchSupported": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilitiesForRealityDevice": {
            "type": "string",
            "nullable": true
          },
          "websiteUrl": {
            "type": "string",
            "nullable": true
          },
          "versionHistory": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VersionHistoryApp"
            },
            "nullable": true
          },
          "isXROSCompatible": {
            "type": "boolean",
            "nullable": true
          },
          "minimumXROSVersion": {
            "type": "string",
            "nullable": true
          },
          "languageList": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "hasSafariExtension": {
            "type": "boolean",
            "nullable": true
          },
          "editorialNotes": {
            "$ref": "#/components/schemas/EditorialNotes"
          },
          "messagesScreenshots": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Artwork"
              }
            },
            "nullable": true
          },
          "requiresGameController": {
            "type": "boolean",
            "nullable": true
          },
          "requiredCapabilities": {
            "type": "string",
            "nullable": true
          },
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OfferApp"
            },
            "nullable": true
          },
          "supportedLocales": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportedLocale"
            },
            "nullable": true
          },
          "requires32bit": {
            "type": "boolean",
            "nullable": true
          },
          "isGameCenterEnabled": {
            "type": "boolean",
            "nullable": true
          },
          "isSiriSupported": {
            "type": "boolean",
            "nullable": true
          },
          "releaseDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "minimumOSVersion": {
            "type": "string",
            "nullable": true
          },
          "hasInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "bundleId": {
            "type": "string",
            "nullable": true
          },
          "hasMessagesExtension": {
            "type": "boolean",
            "nullable": true
          },
          "artwork": {
            "$ref": "#/components/schemas/Artwork"
          },
          "supportsGameController": {
            "type": "boolean",
            "nullable": true
          },
          "privacyPolicyUrl": {
            "type": "string",
            "nullable": true
          },
          "videoPreviewsByType": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/VideoPreviewApp"
              },
              "nullable": true
            },
            "nullable": true
          },
          "hasFamilyShareableInAppPurchases": {
            "type": "boolean",
            "nullable": true
          },
          "supportURLForLanguage": {
            "type": "string",
            "nullable": true
          },
          "isStandaloneForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "isHiddenFromSpringboard": {
            "type": "boolean",
            "nullable": true
          },
          "isDeliveredInIOSAppForWatchOS": {
            "type": "boolean",
            "nullable": true
          },
          "hasPrivacyPolicyText": {
            "type": "boolean",
            "nullable": true
          },
          "editorialArtwork": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Artwork"
            },
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "supportsPassbook": {
            "type": "boolean",
            "nullable": true
          },
          "requirementsString": {
            "type": "string",
            "nullable": true
          },
          "externalVersionId": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "customAttributes": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/components/schemas/CustomAttributesDataByStore"
              }
            },
            "nullable": true
          },
          "usesExternalPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "usesExternalLinkPurchase": {
            "type": "boolean",
            "nullable": true
          },
          "remoteControllerRequirement": {
            "type": "string",
            "nullable": true
          },
          "supportsFunCamera": {
            "type": "boolean",
            "nullable": true
          },
          "maxPlayers": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "minPlayers": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "description": "Public API key header.",
        "name": "X-API-Key",
        "in": "header"
      }
    }
  },
  "tags": [
    {
      "name": "AppCharts"
    },
    {
      "name": "AppRankings"
    },
    {
      "name": "AppReviews"
    },
    {
      "name": "Apps"
    },
    {
      "name": "Auth"
    },
    {
      "name": "Dictionaries"
    },
    {
      "name": "KeywordLiveSearch"
    },
    {
      "name": "KeywordRankings"
    },
    {
      "name": "KeywordSearch"
    },
    {
      "name": "KeywordsTracking"
    },
    {
      "name": "Partners"
    },
    {
      "name": "Projects"
    }
  ],
  "externalDocs": {
    "description": "ASO.dev Public API portal.",
    "url": "https://partners.aso.dev/dashboard/"
  },
  "x-aso-portal-url": "https://partners.aso.dev/dashboard/"
}