{
    "openapi": "3.1.0",
    "info": {
        "title": "AppWanderer Data API",
        "version": "1.0.0",
        "summary": "Read-only JSON access to App Store record boards, per-app metrics, publishers, category reports, data studies and almanac editions.",
        "description": "First-party JSON data computed from public Apple App Store metadata across the tracked catalogue. Access is by approved API key (not public); apply at https://appwanderer.com/developers.\n\nRate limits: every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset (and X-RateLimit-* equivalents); 429 responses include Retry-After. Default budget is 5000 requests/hour per key.\n\nVersioning & deprecation: path-versioned (/api/v1). Additive changes ship within v1; breaking changes ship under a new path (e.g. /api/v2). Deprecations are signalled with the Deprecation and Sunset headers (RFC 8594) at least 6 months before retirement.\n\nAll figures are dated and recomputed on a schedule. Not affiliated with Apple.",
        "termsOfService": "https://appwanderer.com/terms-of-use",
        "contact": {
            "name": "Dor Bass",
            "url": "https://appwanderer.com/developers",
            "email": "contact@appwanderer.com"
        },
        "license": {
            "name": "Free to cite and reproduce with attribution and a link back",
            "url": "https://appwanderer.com/editorial-standards"
        }
    },
    "servers": [
        {
            "url": "https://appwanderer.com",
            "description": "Production"
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ],
    "externalDocs": {
        "description": "Developer portal & API documentation",
        "url": "https://appwanderer.com/developers"
    },
    "tags": [
        {
            "name": "AppWanderer",
            "description": "App Store record data"
        }
    ],
    "paths": {
        "/api/v1": {
            "get": {
                "operationId": "getApiIndex",
                "summary": "API index",
                "description": "Returns the API version, catalogue counts and the list of available endpoints. Public single-resource endpoint: rate-limited per IP; an approved API key raises the limit.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ApiIndex"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/records": {
            "get": {
                "operationId": "listRecords",
                "summary": "List record boards",
                "description": "Paginated list of all standing record boards (leaderboards), each with its leader.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "1-based page number",
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (max 200)",
                        "schema": {
                            "type": "integer",
                            "default": 50
                        }
                    }
                ]
            }
        },
        "/api/v1/record/{slug}": {
            "get": {
                "operationId": "getRecord",
                "summary": "Get a record board",
                "description": "One record board with its ranked entries. Use ?limit to cap the number of entries (default 100, max 200). Public single-resource endpoint: rate-limited per IP; an approved API key raises the limit.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Record"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Record board slug, e.g. biggest-app",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Max entries to return (max 200)",
                        "schema": {
                            "type": "integer",
                            "default": 100
                        }
                    }
                ]
            }
        },
        "/api/v1/apps": {
            "get": {
                "operationId": "listApps",
                "summary": "List apps",
                "description": "Paginated list of tracked apps that carry public ratings, ordered by rating count.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "1-based page number",
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (max 200)",
                        "schema": {
                            "type": "integer",
                            "default": 50
                        }
                    }
                ]
            }
        },
        "/api/v1/app/{id}": {
            "get": {
                "operationId": "getApp",
                "summary": "Get an app",
                "description": "Per-app metrics (rating, price, size, dates, localization) plus the record boards it currently appears on. Public single-resource endpoint: rate-limited per IP; an approved API key raises the limit.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/App"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "description": "Apple track id, e.g. 284882215",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ]
            }
        },
        "/api/v1/publishers": {
            "get": {
                "operationId": "listPublishers",
                "summary": "List publishers",
                "description": "Paginated publisher directory ordered by app count, with total ratings and average rating.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "1-based page number",
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (max 200)",
                        "schema": {
                            "type": "integer",
                            "default": 50
                        }
                    }
                ]
            }
        },
        "/api/v1/developer/{id}": {
            "get": {
                "operationId": "getDeveloper",
                "summary": "Get a publisher",
                "description": "A publisher (Apple artist id): portfolio dossier plus a paginated list of their apps.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Developer"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "description": "Apple artist id",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "1-based page number",
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (max 200)",
                        "schema": {
                            "type": "integer",
                            "default": 50
                        }
                    }
                ]
            }
        },
        "/api/v1/categories": {
            "get": {
                "operationId": "listCategories",
                "summary": "List categories",
                "description": "All App Store categories with their slugs.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/category/{slug}": {
            "get": {
                "operationId": "getCategory",
                "summary": "Get a category report",
                "description": "Standing computed report for one category: pricing, publisher concentration, leaders.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Category"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Category slug, e.g. business",
                        "schema": {
                            "type": "string"
                        }
                    }
                ]
            }
        },
        "/api/v1/studies": {
            "get": {
                "operationId": "listStudies",
                "summary": "List data studies",
                "description": "All original data studies with their titles and last-computed dates.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/studies/{slug}": {
            "get": {
                "operationId": "getStudy",
                "summary": "Get a data study",
                "description": "The computed figures behind one data study. Public single-resource endpoint: rate-limited per IP; an approved API key raises the limit.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Study"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Study slug, e.g. app-store-pricing",
                        "schema": {
                            "type": "string"
                        }
                    }
                ]
            }
        },
        "/api/v1/almanac": {
            "get": {
                "operationId": "listAlmanac",
                "summary": "List almanac editions",
                "description": "All published weekly almanac editions.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/almanac/{week}": {
            "get": {
                "operationId": "getAlmanacEdition",
                "summary": "Get an almanac edition",
                "description": "One weekly almanac edition.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AlmanacEdition"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "week",
                        "in": "path",
                        "required": true,
                        "description": "Week key, e.g. 2026-08-10",
                        "schema": {
                            "type": "string"
                        }
                    }
                ]
            }
        },
        "/api/v1/movers": {
            "get": {
                "operationId": "listMovers",
                "summary": "List board movers",
                "description": "Apps climbing the record boards over the last 7 days.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Max movers (max 50)",
                        "schema": {
                            "type": "integer",
                            "default": 12
                        }
                    }
                ]
            }
        },
        "/api/v1/search": {
            "get": {
                "operationId": "searchApps",
                "summary": "Search apps",
                "description": "Find apps by name; returns ids and links for follow-up lookups.",
                "tags": [
                    "AppWanderer"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListEnvelope"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Missing or invalid API key",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Rate limit exceeded (Retry-After header set)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": true,
                        "description": "Search term (>= 2 chars)",
                        "schema": {
                            "type": "string"
                        }
                    }
                ]
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "description": "Approved API key as a bearer token. Apply at https://appwanderer.com/data."
            }
        },
        "schemas": {
            "Error": {
                "type": "object",
                "required": [
                    "error",
                    "message"
                ],
                "properties": {
                    "error": {
                        "type": "string",
                        "description": "Machine-readable error code",
                        "examples": [
                            "not_found",
                            "authentication_required",
                            "rate_limited",
                            "bad_request"
                        ]
                    },
                    "message": {
                        "type": "string",
                        "description": "Human-readable explanation"
                    },
                    "hint": {
                        "type": "string",
                        "description": "How to resolve the error"
                    },
                    "docs": {
                        "type": "string",
                        "format": "uri",
                        "description": "Documentation URL"
                    }
                }
            },
            "ListMeta": {
                "type": "object",
                "properties": {
                    "page": {
                        "type": "integer"
                    },
                    "per_page": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "generated_at": {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            },
            "ListEnvelope": {
                "type": "object",
                "required": [
                    "data",
                    "meta"
                ],
                "properties": {
                    "data": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "meta": {
                        "$ref": "#/components/schemas/ListMeta"
                    }
                }
            },
            "ApiIndex": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "version": {
                        "type": "string"
                    },
                    "endpoints": {
                        "type": "object"
                    },
                    "catalogue": {
                        "type": "object"
                    }
                }
            },
            "App": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "developer": {
                        "type": "string"
                    },
                    "artist_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "category": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "price": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "currency": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "average_rating": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "rating_count": {
                        "type": "integer"
                    },
                    "file_size_bytes": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "language_count": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "content_rating": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "min_os_version": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "release_date": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "current_version_release_date": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "version": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "store_url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "app_url": {
                        "type": "string",
                        "format": "uri"
                    }
                }
            },
            "Record": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "measures": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "considered": {
                        "type": "integer"
                    },
                    "computed_at": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "entries": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "rank": {
                                    "type": "integer"
                                },
                                "app_id": {
                                    "type": "integer"
                                },
                                "name": {
                                    "type": "string"
                                },
                                "developer": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "value": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "Developer": {
                "type": "object",
                "properties": {
                    "artist_id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "dossier": {
                        "type": "object"
                    },
                    "apps": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/App"
                        }
                    }
                }
            },
            "Category": {
                "type": "object",
                "description": "Standing category report (pricing, concentration, leaders)."
            },
            "Study": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string"
                    },
                    "title": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "dek": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "computed_at": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "figures": {
                        "type": "object"
                    }
                }
            },
            "AlmanacEdition": {
                "type": "object",
                "properties": {
                    "week": {
                        "type": "string"
                    },
                    "title": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "published_at": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "intro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            }
        }
    }
}