Documentación de PlayTop Global

API REST con datos de Google Play: 4 millones de apps, desarrolladores, apps nuevas y eliminadas, palabras clave de títulos. Formato JSON, codificación UTF-8, CORS habilitado.

Inicio rápido

URL base: https://apiplay.top/api/v1. Regístrate, crea una clave API en tu cuenta y envía tu primera solicitud:

Descripción de la API legible por máquina: OpenAPI 3.1 · colección de Postman — impórtala en Postman, Insomnia o un generador de clientes (openapi-generator) y obtendrás un SDK listo para tu lenguaje.

curl -H "X-API-Key: TU_CLAVE" "https://apiplay.top/api/v1/app?id=com.whatsapp"

Los datos cubren más de 4 millones de apps de Google Play de la tienda de EE. UU. en inglés (de otro país si la app no está en EE. UU.), actualizados cada noche. Las apps que desaparecen de la tienda permanecen en la base con sus últimos datos.

Autenticación

Toda solicitud, salvo /v1/health, debe incluir la clave API en una cabecera:

X-API-Key: ak_live_…

También se acepta: Authorization: Bearer …. No se permite pasar la clave en los parámetros de la URL: acabaría en los registros y en el historial del navegador.

Guarda la clave en tu servidor. Si la incrustas en el JavaScript de la página, cualquier visitante puede copiarla. Envía las solicitudes del frontend a través de tu backend.

Créditos y límites

Cada llamada cuesta 0–3 créditos según el endpoint, sin importar cuántas filas devuelva (hasta 100); la llamada por lotes apps cuesta 1 crédito por app. Primero se gastan los créditos del plan del mes en curso y luego el saldo prepago. Si la solicitud falla por nuestra parte, los créditos se devuelven. Planes y paquetes

CabeceraSignificado
X-Credits-Costcréditos que costó esta solicitud
X-Credits-Remainingcréditos restantes (plan + saldo)
X-CacheHIT — servido desde la caché (más rápido), MISS — consulta nueva al índice
X-RateLimit-Limit / -Remainingel límite por minuto de la clave y lo que queda
X-Planfree | pro | scale | business

Tus créditos restantes también aparecen en el campo _credits de cada respuesta y en /v1/account (gratis).

Formato de respuesta y errores

Cada respuesta tiene el campo ok. Las listas contienen results, total, page, per, pages. Error: ok = false, error es la explicación, code es un código para máquinas. Las fechas son ISO 8601 en UTC.

{ "ok": true, "app": { "id": "com.whatsapp", "title": "WhatsApp", "installs": { "label": "10,000,000,000+", "min": 10000000000, "real": 12445120489 }, … },
  "_credits": { "cost": 1, "plan_remaining": 1999, "balance": 0, "available": 1999, "cached": false } }

{ "ok": false, "code": "insufficient_credits", "error": "Not enough credits: this call costs 2, you have 1. …" }
HTTPcodeCuándo
400invalid_param, invalid_requestparámetro no válido o ausente
401missing_api_key, invalid_api_keysin clave o la clave está revocada
402insufficient_creditscréditos insuficientes: recarga o mejora tu plan
403account_blocked, plan_requiredla cuenta está bloqueada o el endpoint requiere un plan superior
404not_foundla app o el desarrollador no está en la base, o el endpoint no existe
429rate_limitedse superó el límite de solicitudes por minuto
503service_unavailableproblema temporal de la base: reinténtalo más tarde; no se cobran créditos

Endpoints

Todos los endpoints son GET /api/v1/{nombre}. Paginación: page (desde 1) y per (1–100), hasta el resultado 10.000. Orden: sort + order=asc|desc.

GET/api/v1/accountgratis

Tu plan, créditos del plan y saldo, la fecha de renovación de créditos y el límite por minuto.

Apps
GET/api/v1/app 1 cr.

La ficha completa de la app: título, descripción, novedades, instalaciones (umbral y número exacto), valoración, número de valoraciones y reseñas, distribución de estrellas, precio, compras, anuncios, categoría, clasificación por edad, versión, Android mínimo, fechas de lanzamiento y actualización, icono, capturas, vídeo, desarrollador y su sitio. Para las eliminadas: los últimos datos guardados y la fecha de desaparición.

id *nombre de paquete de la app
GET · POST/api/v1/apps 1 crédito por app

Hasta 100 apps en una solicitud: GET ?ids=a,b,c o POST con la lista en el cuerpo (una por línea o JSON {"ids": […]}). 1 crédito por app; las que no encontramos vuelven en not_found.

ids *nombres de paquete separados por comas, hasta 100
GET/api/v1/suggest gratis

Sugerencias por el inicio del título: las 10 coincidencias más populares. Gratis.

q *inicio del título, 2+ caracteres
Desarrolladores
GET/api/v1/developer 2 cr.

Un desarrollador y todas sus apps: número (en la tienda y eliminadas), instalaciones totales, valoración media, primer lanzamiento, categorías, sitio. En el plan Business: email, teléfono, dirección y razón social.

idID del desarrollador (de la ficha de una app: developer.id)
nameo el nombre exacto del desarrollador
statusall (por defecto), live o removed
sortrelevance | installs | real_installs | score | ratings | reviews | released | updated | price
pagepágina, desde 1
perfilas por página, 1–100 (por defecto 20)
Cambios en la tienda
GET/api/v1/new 2 cr.

Apps nuevas por fecha del primer lanzamiento, las más recientes primero.

sincedesde esta fecha, YYYY-MM-DD (por defecto, hace 7 días)
untilhasta esta fecha inclusive
categoryID de categoría, p. ej. GAME_PUZZLE (ver /v1/categories)
min_installsmínimo de instalaciones (umbrales de Google Play: 1000, 10000…)
langidioma del título, código ISO: en, de, pt…
sortrelevance | installs | real_installs | score | ratings | reviews | released | updated | price
pagepágina, desde 1
perfilas por página, 1–100 (por defecto 20)
GET/api/v1/removed 2 cr.

Apps que desaparecieron de Google Play (ausentes en los 19 países que comprobamos), por fecha de desaparición. La ficha conserva los últimos datos.

sincedesde esta fecha, YYYY-MM-DD (por defecto, hace 7 días)
untilhasta esta fecha inclusive
categoryID de categoría, p. ej. GAME_PUZZLE (ver /v1/categories)
min_installsmínimo de instalaciones (umbrales de Google Play: 1000, 10000…)
sortremoved_at | installs | score
pagepágina, desde 1
perfilas por página, 1–100 (por defecto 20)
Mercado
GET/api/v1/keywords 2 cr.

Palabras y frases de títulos de apps por idioma: cuántas apps y desarrolladores las usan, cuántas son fuertes (100 mil+ instalaciones), instalaciones totales, cuota del líder y una puntuación de oportunidad.

langidioma, por defecto en
qpalabra o frase
phrasetrue — solo frases de dos palabras, false — solo palabras sueltas
min_appsmínimo de apps
max_appsmáximo de apps
sortopportunity | apps | installs | strong | devs | max_installs
orderdesc | asc
pagepágina, desde 1
perfilas por página, 1–100 (por defecto 20)
GET/api/v1/categories gratis

Todas las categorías con número de apps e instalaciones totales. Gratis.

statuslive (en la tienda, por defecto), removed o all
GET/api/v1/free_domains 3 cr.Pro+

Apps cuyo dominio del sitio del desarrollador está libre para registrar, con la popularidad de la app. Plan Pro o superior.

categoryID de categoría, p. ej. GAME_PUZZLE (ver /v1/categories)
min_installsmínimo de instalaciones (umbrales de Google Play: 1000, 10000…)
statuslive (en la tienda, por defecto), removed o all
tldzona de dominio, p. ej. com
sortrelevance | installs | real_installs | score | ratings | reviews | released | updated | price
pagepágina, desde 1
perfilas por página, 1–100 (por defecto 20)
GET/api/v1/charts 2 cr.

Un ranking de Google Play de un país y categoría: hasta 200 posiciones, cambio de puesto desde la captura anterior (change: cuántos puestos subió, "new" para las nuevas), icono e instalaciones.

country *país, código ISO: US, DE, BR…
category *categoría, p. ej. GAME_PUZZLE
collectionfree | paid | grossing
pagepágina, desde 1
perfilas por página, 1–100 (por defecto 20)
GET/api/v1/rankings 1 cr.

Todos los rankings en los que está la app en la última captura: país, categoría, colección, puesto; número de rankings y países y mejor puesto.

id *nombre de paquete de la app
countrysolo un país
collectionfree | paid | grossing
GET/api/v1/availability 1 cr.

Países donde la app está disponible en Google Play (según hreflang del sitemap de la tienda). Con 190+ países se devuelve worldwide = true sin lista.

id *nombre de paquete de la app
GET/api/v1/markets 1 cr.

Competencia por mercado según los rankings gratuitos: umbral de entrada al top 100 y top 200 (instalaciones de la app en esa posición), cuota de apps nuevas (12 meses) y locales (≤3 países) en el top y tamaño del mercado local. Sin parámetros: todos los países; country: las categorías de un país; category: una categoría en todos los países.

countrypaís, código ISO
categoryID de categoría, p. ej. GAME_PUZZLE (ver /v1/categories)
sortentry100 | entry200 | new_share | local_share | local_apps | local_installs | local_new
orderdesc | asc
pagepágina, desde 1
perfilas por página, 1–100 (por defecto 20)
GET/api/v1/stats gratis

Tamaño de la base: apps en la tienda y eliminadas, desarrolladores, nuevas y eliminadas en 7 días, hora de la última actualización. Gratis.

* — parámetro obligatorio

Ejemplos de código

# curl — one app
curl -H "X-API-Key: $KEY" "https://apiplay.top/api/v1/app?id=org.telegram.messenger"

# curl — puzzle games with 10M+ installs, best rated first
curl -H "X-API-Key: $KEY" "https://apiplay.top/api/v1/search?category=GAME_PUZZLE&min_installs=10000000&sort=score"

# curl — up to 100 apps in one call (POST, one package per line)
curl -H "X-API-Key: $KEY" --data-binary $'com.whatsapp\norg.telegram.messenger' "https://apiplay.top/api/v1/apps"
# Python — apps removed from Google Play this week
import os, requests
r = requests.get("https://apiplay.top/api/v1/removed",
                 params={"since": "2026-10-20", "min_installs": 100000, "per": 100},
                 headers={"X-API-Key": os.environ["KEY"]}, timeout=30)
r.raise_for_status()
data = r.json()
for app in data["results"]:
    print(app["removed_seen_at"], app["id"], app["installs"]["label"])
print("credits left:", data["_credits"]["available"])
// Node.js 18+ (en el servidor, no en el navegador)
const res = await fetch("https://apiplay.top/api/v1/developer?id=5191370068110375942", { headers: { "X-API-Key": process.env.KEY } });
const d = await res.json();
if (!d.ok) throw new Error(d.error);
console.log(d.developer.name, d.developer.apps, d.developer.total_installs);
// PHP
$ch = curl_init('https://apiplay.top/api/v1/keywords?lang=en&q=vpn&per=50');
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('KEY')]]);
$d = json_decode(curl_exec($ch), true);
foreach ($d['results'] as $k) echo $k['keyword'], ' — ', $k['apps'], PHP_EOL;

Pruébalo

Puedes crear una clave en tu cuenta. La solicitud va directamente desde tu navegador. La clave no se guarda en ningún sitio y desaparece al recargar la página. Las solicitudes desde la consola gastan créditos como cualquier otra.