{"openapi":"3.1.0","info":{"title":"BestAppify API","version":"1.0.0","description":"Shopify App Store intelligence for app developers: keyword rankings, competitors,\nreview analysis, listing analytics and revenue — for your own apps and for the market.\n\nAuthenticate with an API key from https://bestappify.app/dashboard/api as\n`Authorization: Bearer ba_live_…`.\n\nRate limits: 120 requests per minute and 10,000 per day, per key.\n\nError codes: missing_api_key (401), invalid_api_key (401), rate_limited (429), daily_limit_reached (429), app_not_found (404), keyword_not_tracked (404), category_not_found (404), missing_query (400), app_not_in_catalog (409), service_unavailable (503), internal_error (500)."},"servers":[{"url":"https://bestappify.app"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key created in the BestAppify dashboard."}},"responses":{"Error":{"description":"Failure","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["missing_api_key","invalid_api_key","rate_limited","daily_limit_reached","app_not_found","keyword_not_tracked","category_not_found","missing_query","app_not_in_catalog","service_unavailable","internal_error"]},"message":{"type":"string"}}}}}}}}}},"tags":[{"name":"Account","description":"The key and the account behind it."},{"name":"Your apps","description":"Data about apps on your account."},{"name":"Market data","description":"The whole App Store catalog."}],"paths":{"/api/v1/me":{"get":{"tags":["Account"],"summary":"Your account, apps and rate limits","description":"Confirms the key works and returns the app references every other endpoint accepts, plus how much of your rate limit you have used.","operationId":"me","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps":{"get":{"tags":["Your apps"],"summary":"List your tracked apps","description":"Every app on your account. The `app` field is the handle used in the paths below; `tracked_app_id` and `app_id` are returned for callers that prefer ids.","operationId":"apps","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/keywords":{"get":{"tags":["Your apps"],"summary":"Keyword rankings","description":"Your tracked keywords for one app with today's position, the week-over-week change, and the difficulty, competition and demand indices. `position` is the live standing and is null when the app did not appear in the latest crawl. `last_known_position` and `change` come from the rank history keyed to your app in our catalog; `is_current: false` means that history is a little behind the newest crawl, not that the app stopped ranking.","operationId":"apps_app_keywords","parameters":[{"name":"app","in":"path","required":true,"description":"App handle, listing URL, tracked_app_id or app_id.","schema":{"type":"string"},"example":"fast-bundle"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/keywords/{keyword}":{"get":{"tags":["Your apps"],"summary":"One keyword, with full rank history","description":"Daily rank history for a single tracked keyword, oldest first, plus its current standing. `{keyword}` is the term (URL-encoded) or its keyword_id.","operationId":"apps_app_keywords_keyword","parameters":[{"name":"app","in":"path","required":true,"description":"App handle or id.","schema":{"type":"string"}},{"name":"keyword","in":"path","required":true,"description":"Keyword term, URL-encoded, or its keyword_id.","schema":{"type":"string"},"example":"product%20bundles"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/opportunities":{"get":{"tags":["Your apps"],"summary":"Keyword opportunities","description":"Keywords one of your tracked competitors ranks for and this app does not, with the competitor's position.","operationId":"apps_app_opportunities","parameters":[{"name":"app","in":"path","required":true,"description":"App handle or id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/competitors":{"get":{"tags":["Your apps"],"summary":"Competitors and keyword overlap","description":"Your tracked competitor set with current rank and rank change, plus the keyword overlap matrix showing where each of you places.","operationId":"apps_app_competitors","parameters":[{"name":"app","in":"path","required":true,"description":"App handle or id.","schema":{"type":"string"}},{"name":"include","in":"query","required":false,"description":"Set to `timeline` to also return the daily rank timeline for every app.","schema":{"type":"string"},"example":"timeline"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/reviews":{"get":{"tags":["Your apps"],"summary":"Review intelligence","description":"Rating distribution, monthly review trend, countries, the AI theme analysis (what merchants love, complain about and ask for) and a comparison against your tracked competitors.","operationId":"apps_app_reviews","parameters":[{"name":"app","in":"path","required":true,"description":"App handle or id.","schema":{"type":"string"}},{"name":"recent","in":"query","required":false,"description":"How many individual recent reviews to include. Default 10, max 50.","schema":{"type":"integer"},"example":"25"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/analytics":{"get":{"tags":["Your apps"],"summary":"Listing analytics","description":"Listing views, install clicks, installs, click-through and conversion from the Google Analytics property linked to the app, daily and totalled. Returns `connected: false` when no property is linked.","operationId":"apps_app_analytics","parameters":[{"name":"app","in":"path","required":true,"description":"App handle or id.","schema":{"type":"string"}},{"name":"days","in":"query","required":false,"description":"Window in days. Default 90, max 365.","schema":{"type":"integer"},"example":"30"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/revenue":{"get":{"tags":["Your apps"],"summary":"Revenue and churn","description":"Monthly MRR, churn rate, trials, installs, uninstalls and net revenue from the Shopify Partner API. MRR and churn are derived from the subscription charge lifecycle — the Partner API publishes neither directly. Returns `connected: false` when the app is not linked to a Partner app.","operationId":"apps_app_revenue","parameters":[{"name":"app","in":"path","required":true,"description":"App handle or id.","schema":{"type":"string"}},{"name":"months","in":"query","required":false,"description":"Months of history. Default 12, max 36.","schema":{"type":"integer"},"example":"24"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/apps/{app}/intelligence":{"get":{"tags":["Your apps"],"summary":"App intelligence","description":"Rank trajectory over time, position in each category, nearest competitors by category rank, and how the app's entry price compares with its peers.","operationId":"apps_app_intelligence","parameters":[{"name":"app","in":"path","required":true,"description":"App handle or id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/market/apps":{"get":{"tags":["Market data"],"summary":"Search the App Store catalog","description":"Search every app we hold by name — not only your own. This is how you find a competitor's handle before looking it up.","operationId":"market_apps","parameters":[{"name":"q","in":"query","required":true,"description":"Search term matched against the app name.","schema":{"type":"string"},"example":"bundle"},{"name":"limit","in":"query","required":false,"description":"Results to return. Default 20, max 50.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/market/apps/{app}":{"get":{"tags":["Market data"],"summary":"One catalog app","description":"Any app in our catalog by handle, listing URL or id: rating, review count, description, categories, pricing plans and listing status.","operationId":"market_apps_app","parameters":[{"name":"app","in":"path","required":true,"description":"App handle, listing URL or id.","schema":{"type":"string"}},{"name":"include","in":"query","required":false,"description":"Set to `intelligence` to add rank trajectory and the pricing benchmark.","schema":{"type":"string"},"example":"intelligence"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/market/leaderboard":{"get":{"tags":["Market data"],"summary":"Top apps by review volume","description":"The App Store leaderboard, overall or for one category. Ranked by review count, because Shopify publishes no install numbers.","operationId":"market_leaderboard","parameters":[{"name":"category","in":"query","required":false,"description":"Category id or exact title. Omit for the overall board.","schema":{"type":"string"},"example":"Product bundles"},{"name":"limit","in":"query","required":false,"description":"Apps to return. Default 25, max 100.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/market/movers":{"get":{"tags":["Market data"],"summary":"Week-over-week rank movement","description":"Which apps climbed and which fell over the last week, from our daily rank snapshots. `change` is positive for a climb; `rank_a_week_ago: null` marks an app new to the ranking.","operationId":"market_movers","parameters":[{"name":"category","in":"query","required":false,"description":"Category id or exact title.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Apps to return. Default 25, max 100.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/market/niches":{"get":{"tags":["Market data"],"summary":"Category growth and concentration","description":"Every category with its app count, growth and the leader's share of reviews — for judging whether a niche is crowded or open.","operationId":"market_niches","parameters":[{"name":"limit","in":"query","required":false,"description":"Categories to return. Default 30, max 100.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/api/v1/market/categories":{"get":{"tags":["Market data"],"summary":"List categories","description":"The App Store categories we hold at least five apps for, with counts. These ids and titles are what `?category=` accepts.","operationId":"market_categories","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The payload for this endpoint."},"meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"}}}}}}}},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}}}}