{
 "openapi": "3.1.0",
 "info": {
  "title": "Revunda free review endpoints",
  "version": "2026-10-24",
  "description": "Free, keyless endpoints behind Revunda's public tools. GET only. The JSON endpoints send no CORS headers, so call them from a server. Limits are per IP and per server instance; treat them as maximums. Higher volume: https://rapidapi.com/revunda/api/revunda-gbp-suspension-risk-app-review-insights",
  "contact": {
   "email": "nebu@mail.grokbot.com",
   "url": "https://revunda.xyz/developers/"
  },
  "termsOfService": "https://revunda.xyz/legal/"
 },
 "servers": [
  {
   "url": "https://revunda.xyz"
  }
 ],
 "externalDocs": {
  "description": "Developer docs",
  "url": "https://revunda.xyz/developers/"
 },
 "tags": [
  {
   "name": "app-reviews"
  },
  {
   "name": "badges"
  }
 ],
 "paths": {
  "/api/check": {
   "get": {
    "operationId": "checkAppComplaints",
    "tags": [
     "app-reviews"
    ],
    "summary": "Top 3 complaint themes in the latest 50 reviews of an App Store or Google Play app (storefront from the link, else country/lang, else US)",
    "description": "Every 1–3★ review is classified by an AI model into 7 themes. 20 requests per day per IP (repeat requests count), a shared daily cap for all users, results cached per app per day.",
    "parameters": [
     {
      "name": "url",
      "in": "query",
      "required": true,
      "description": "App Store link, numeric App Store ID, Google Play link or package name",
      "schema": {
       "type": "string"
      },
      "examples": {
       "appStore": {
        "value": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580"
       },
       "googlePlay": {
        "value": "com.spotify.music"
       }
      }
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "Optional storefront, ISO 3166-1 alpha-2 (de, fr, gb…). Used when the link has none (numeric ID, package name, Play link without gl). Default us. Fewer than 20 local reviews are topped up with US reviews.",
      "schema": {
       "type": "string",
       "pattern": "^[A-Za-z]{2}$"
      }
     },
     {
      "name": "lang",
      "in": "query",
      "required": false,
      "description": "Optional page-language hint (de, fr, es, pl, it, pt, en). Maps to a storefront when neither the link nor country gives one (de→de, fr→fr…, en→us) and sets the Google Play hl.",
      "schema": {
       "type": "string",
       "pattern": "^[a-z]{2}$"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Top complaint themes",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CheckResult"
        },
        "examples": {
         "appStore": {
          "value": {
           "app": "Spotify: Music and Podcasts",
           "id": "324684580",
           "reviews": 50,
           "negative": 10,
           "classified": 10,
           "top": [
            {
             "theme": "Pricing / subscription",
             "n": 6,
             "quote": "They are now playing adds after EVERY song instead of just after a few songs, and of course you need to pay a subscription just to do simple…",
             "stars": 2
            },
            {
             "theme": "Bugs",
             "n": 2,
             "quote": "It has a lot of the songs and that’s why I’m happy with it but if you don’t have premium I would suggest of making a playlist of all the son…",
             "stars": 3
            }
           ],
           "day": "2026-10-24",
           "rating": 4.8,
           "count": 42722184,
           "genre": "Music",
           "med": 4.8,
           "peers": [
            {
             "n": "Suno",
             "id": "6480136315",
             "r": 4.9
            },
            {
             "n": "Shazam: Find Music & Concerts",
             "id": "284993459",
             "r": 4.9
            }
           ],
           "tok": "<opaque>"
          }
         },
         "googlePlay": {
          "value": {
           "store": "play",
           "app": "Spotify: Music and Podcasts",
           "id": "com.spotify.music",
           "developer": "Spotify AB",
           "reviews": 50,
           "negative": 21,
           "classified": 21,
           "top": [
            {
             "theme": "Ads",
             "n": 8,
             "quote": "Paying for Spotify Premium to listen to announcements anyway between every podcast ? There are other really good options to go if you want t…",
             "stars": 3
            },
            {
             "theme": "Bugs",
             "n": 7,
             "quote": "Music now permanently will cut out in the background with the song still playing after give or take 10 seconds. this has been a issue for pe…",
             "stars": 3
            }
           ],
           "day": "2026-10-24",
           "rating": 4.3,
           "count": 36529556,
           "genre": "Music & Audio",
           "med": null,
           "peers": [],
           "ios": {
            "id": "324684580",
            "name": "Spotify: Music and Podcasts"
           }
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Not an App Store or Google Play link",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such app, or no recent reviews in that storefront or the US",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Daily limit reached (20 per IP)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "502": {
      "description": "AI classifier not responding",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "503": {
      "description": "Shared daily cap reached, or Google Play unavailable",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "504": {
      "description": "Google Play slow to respond",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/rexport": {
   "get": {
    "operationId": "exportAppStoreReviews",
    "tags": [
     "app-reviews"
    ],
    "summary": "Newest App Store reviews, 50 per page, up to 10 pages per storefront",
    "description": "40 requests per minute and 400 per day per IP. CDN-cached for up to 6 hours. An unknown app returns 200 with app null and no reviews.",
    "parameters": [
     {
      "name": "id",
      "in": "query",
      "required": true,
      "description": "Numeric App Store ID",
      "schema": {
       "type": "string",
       "pattern": "^[0-9]{5,12}$"
      },
      "example": "324684580"
     },
     {
      "name": "cc",
      "in": "query",
      "description": "Storefront",
      "schema": {
       "type": "string",
       "enum": [
        "us",
        "gb",
        "ca",
        "au",
        "nz",
        "ie",
        "in",
        "sg",
        "de",
        "at",
        "ch",
        "fr",
        "be",
        "nl",
        "lu",
        "es",
        "pt",
        "it",
        "pl",
        "cz",
        "sk",
        "hu",
        "ro",
        "bg",
        "gr",
        "se",
        "no",
        "dk",
        "fi",
        "ee",
        "lv",
        "lt",
        "tr",
        "ua",
        "il",
        "ae",
        "sa",
        "eg",
        "za",
        "ng",
        "ke",
        "mx",
        "br",
        "ar",
        "cl",
        "co",
        "pe",
        "jp",
        "kr",
        "tw",
        "hk",
        "th",
        "vn",
        "ph",
        "id",
        "my"
       ],
       "default": "us"
      }
     },
     {
      "name": "page",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 10,
       "default": 1
      }
     }
    ],
    "responses": {
     "200": {
      "description": "One page of reviews",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AppStorePage"
        },
        "example": {
         "id": "324684580",
         "cc": "us",
         "page": 1,
         "reviews": [
          {
           "id": "14698713946",
           "date": "2026-10-22T14:06:07-07:00",
           "rating": 5,
           "title": "Love spotify just 1 complaint",
           "text": "On one of the recent updates something changed and my gen 2 onn party speaker started sounding distorted/clipping and its only when i have v…",
           "version": "9.1.92",
           "votes": 0,
           "voters": 0
          }
         ],
         "app": {
          "name": "Spotify: Music and Podcasts",
          "seller": "Spotify",
          "rating": 4.77081,
          "ratings": 42722184,
          "version": "9.1.94"
         },
         "more": true
        }
       }
      }
     },
     "400": {
      "description": "Bad id, storefront or page",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "bad_input"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/RateLimited"
        },
        "example": {
         "error": "rate_limited",
         "retry_after": 60
        }
       }
      }
     },
     "502": {
      "description": "Apple's feed did not answer",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "upstream"
        }
       }
      }
     }
    }
   }
  },
  "/api/pexport": {
   "get": {
    "operationId": "exportGooglePlayReviews",
    "tags": [
     "app-reviews"
    ],
    "summary": "Newest Google Play reviews, up to 100 per page, paginated with a token",
    "description": "12 requests per minute and 100 per day per IP. Pass `next` from one response as `t` to get the next page.",
    "parameters": [
     {
      "name": "app",
      "in": "query",
      "required": true,
      "description": "Package name",
      "schema": {
       "type": "string"
      },
      "example": "com.spotify.music"
     },
     {
      "name": "lang",
      "in": "query",
      "description": "Review language",
      "schema": {
       "type": "string",
       "enum": [
        "en",
        "es",
        "de",
        "fr",
        "it",
        "pt",
        "pl",
        "nl",
        "sv",
        "da",
        "no",
        "fi",
        "cs",
        "sk",
        "hu",
        "ro",
        "bg",
        "el",
        "tr",
        "uk",
        "ru",
        "ja",
        "ko",
        "zh",
        "id",
        "th",
        "vi",
        "ar",
        "he",
        "hi"
       ],
       "default": "en"
      }
     },
     {
      "name": "cc",
      "in": "query",
      "description": "Country",
      "schema": {
       "type": "string",
       "enum": [
        "us",
        "gb",
        "ca",
        "au",
        "nz",
        "ie",
        "in",
        "sg",
        "de",
        "at",
        "ch",
        "fr",
        "be",
        "nl",
        "es",
        "pt",
        "it",
        "pl",
        "cz",
        "sk",
        "hu",
        "ro",
        "bg",
        "gr",
        "se",
        "no",
        "dk",
        "fi",
        "tr",
        "ua",
        "il",
        "ae",
        "sa",
        "za",
        "ng",
        "mx",
        "br",
        "ar",
        "cl",
        "co",
        "jp",
        "kr",
        "tw",
        "hk",
        "th",
        "vn",
        "ph",
        "id",
        "my"
       ],
       "default": "us"
      }
     },
     {
      "name": "t",
      "in": "query",
      "description": "The `next` token from the previous page",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "One page of reviews",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PlayPage"
        },
        "example": {
         "app": "com.spotify.music",
         "lang": "en",
         "cc": "us",
         "reviews": [
          {
           "id": "9f4851bc-18de-4567-9241-2bfd5436c7d5",
           "date": "2026-10-23T02:02:36.442Z",
           "rating": 5,
           "title": "",
           "text": "so nice 👍🏼👍🏼 spotify",
           "version": "9.1.90.2270",
           "votes": 0,
           "replied": false
          }
         ],
         "info": {
          "name": "Spotify: Music and Podcasts",
          "developer": "Spotify AB",
          "rating": 4.348969,
          "ratings": 36529556,
          "version": "VARY"
         },
         "next": "Cs4BIsUBAV8d1P2eGXKBg74A…"
        }
       }
      }
     },
     "400": {
      "description": "Bad input",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "bad_input"
        }
       }
      }
     },
     "404": {
      "description": "No public app with that package name",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "not_found"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/RateLimited"
        },
        "example": {
         "error": "rate_limited",
         "retry_after": 60
        }
       }
      }
     },
     "502": {
      "description": "Google Play did not answer",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "upstream"
        }
       }
      }
     }
    }
   }
  },
  "/api/badge": {
   "get": {
    "operationId": "appStoreRatingBadge",
    "tags": [
     "badges"
    ],
    "summary": "SVG badge with an app's App Store rating and number of ratings",
    "description": "CORS enabled, cached 12 hours. Bad input returns status 400 with an 'invalid id' badge.",
    "parameters": [
     {
      "name": "id",
      "in": "query",
      "required": true,
      "description": "Numeric App Store ID",
      "schema": {
       "type": "string"
      },
      "example": "324684580"
     },
     {
      "name": "country",
      "in": "query",
      "description": "Two-letter storefront",
      "schema": {
       "type": "string",
       "default": "us"
      }
     },
     {
      "name": "label",
      "in": "query",
      "schema": {
       "type": "string",
       "maxLength": 24,
       "default": "App Store"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "SVG badge",
      "content": {
       "image/svg+xml": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "400": {
      "description": "Invalid id or country, as an SVG badge",
      "content": {
       "image/svg+xml": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Error": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "string"
     }
    }
   },
   "RateLimited": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "string",
      "enum": [
       "rate_limited",
       "busy"
      ]
     },
     "retry_after": {
      "oneOf": [
       {
        "type": "integer",
        "description": "Seconds"
       },
       {
        "type": "string",
        "enum": [
         "tomorrow"
        ]
       }
      ]
     }
    }
   },
   "Theme": {
    "type": "object",
    "properties": {
     "theme": {
      "type": "string",
      "enum": [
       "Bugs",
       "Crashes / freezes",
       "Feature requests",
       "Pricing / subscription",
       "UX / design",
       "Ads",
       "Performance"
      ]
     },
     "n": {
      "type": "integer",
      "description": "Reviews in this theme"
     },
     "quote": {
      "type": "string",
      "maxLength": 280
     },
     "stars": {
      "type": "integer"
     }
    }
   },
   "CheckResult": {
    "type": "object",
    "required": [
     "app",
     "id",
     "reviews",
     "negative",
     "classified",
     "top",
     "day"
    ],
    "properties": {
     "country": {
      "type": "string",
      "description": "Storefront read, e.g. us, de, or de+us when US reviews topped up a thin local feed"
     },
     "store": {
      "type": "string",
      "enum": [
       "play"
      ],
      "description": "Present on Google Play results only"
     },
     "app": {
      "type": "string"
     },
     "id": {
      "type": "string"
     },
     "developer": {
      "type": "string",
      "description": "Google Play only"
     },
     "reviews": {
      "type": "integer",
      "description": "Reviews read (up to 50)"
     },
     "negative": {
      "type": "integer",
      "description": "1–3★ reviews"
     },
     "classified": {
      "type": "integer"
     },
     "top": {
      "type": "array",
      "maxItems": 3,
      "items": {
       "$ref": "#/components/schemas/Theme"
      }
     },
     "day": {
      "type": "string",
      "format": "date"
     },
     "rating": {
      "type": [
       "number",
       "null"
      ]
     },
     "count": {
      "type": [
       "integer",
       "null"
      ],
      "description": "Number of ratings"
     },
     "genre": {
      "type": [
       "string",
       "null"
      ]
     },
     "med": {
      "type": [
       "number",
       "null"
      ],
      "description": "Median rating of the top free apps in the same App Store genre (iOS only)"
     },
     "peers": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "n": {
         "type": "string"
        },
        "id": {
         "type": "string"
        },
        "r": {
         "type": "number"
        }
       }
      }
     },
     "ios": {
      "type": [
       "object",
       "null"
      ],
      "description": "The same app on the App Store (Google Play only)",
      "properties": {
       "id": {
        "type": "string"
       },
       "name": {
        "type": "string"
       }
      }
     },
     "cached": {
      "type": "boolean"
     },
     "tok": {
      "type": "string",
      "description": "Opaque; ignore"
     }
    }
   },
   "AppStoreReview": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "date": {
      "type": "string"
     },
     "rating": {
      "type": [
       "integer",
       "null"
      ]
     },
     "title": {
      "type": "string"
     },
     "text": {
      "type": "string"
     },
     "version": {
      "type": "string"
     },
     "votes": {
      "type": "integer"
     },
     "voters": {
      "type": "integer"
     }
    }
   },
   "AppStorePage": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "cc": {
      "type": "string"
     },
     "page": {
      "type": "integer"
     },
     "app": {
      "type": [
       "object",
       "null"
      ],
      "description": "Page 1 only",
      "properties": {
       "name": {
        "type": "string"
       },
       "seller": {
        "type": "string"
       },
       "rating": {
        "type": [
         "number",
         "null"
        ]
       },
       "ratings": {
        "type": "integer"
       },
       "version": {
        "type": "string"
       }
      }
     },
     "reviews": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/AppStoreReview"
      }
     },
     "more": {
      "type": "boolean"
     }
    }
   },
   "PlayReview": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "date": {
      "type": "string",
      "format": "date-time"
     },
     "rating": {
      "type": [
       "integer",
       "null"
      ]
     },
     "title": {
      "type": "string"
     },
     "text": {
      "type": "string"
     },
     "version": {
      "type": [
       "string",
       "null"
      ]
     },
     "votes": {
      "type": "integer"
     },
     "replied": {
      "type": "boolean"
     }
    }
   },
   "PlayPage": {
    "type": "object",
    "properties": {
     "app": {
      "type": "string"
     },
     "lang": {
      "type": "string"
     },
     "cc": {
      "type": "string"
     },
     "info": {
      "type": "object",
      "description": "First page only",
      "properties": {
       "name": {
        "type": "string"
       },
       "developer": {
        "type": "string"
       },
       "rating": {
        "type": [
         "number",
         "null"
        ]
       },
       "ratings": {
        "type": [
         "integer",
         "null"
        ]
       },
       "version": {
        "type": [
         "string",
         "null"
        ]
       }
      }
     },
     "reviews": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/PlayReview"
      }
     },
     "next": {
      "type": [
       "string",
       "null"
      ]
     }
    }
   }
  }
 }
}