APK API 문서

Google Play 데이터를 제공하는 REST API: 앱 400만 개, 개발자, 신규 및 삭제된 앱, 제목 키워드. 형식: JSON, 인코딩: UTF-8, CORS 지원.

빠른 시작

기본 URL: https://apkapi.com/api/v1. 회원가입하고 API 키를 계정 페이지에서 만든 다음 첫 요청을 보내세요:

기계가 읽을 수 있는 API 설명: OpenAPI 3.1 · Postman 컬렉션 — Postman, Insomnia 또는 클라이언트 생성기(openapi-generator)로 가져오면 사용하는 언어에 맞는 SDK를 바로 얻을 수 있습니다.

curl -H "X-API-Key: YOUR_KEY" "https://apkapi.com/api/v1/app?id=com.whatsapp"

데이터는 미국 스토어의 영어판을 기준으로 400만 개 이상의 Google Play 앱을 다루며(미국에서 제공되지 않는 앱은 다른 국가 기준), 매일 밤 갱신됩니다. 스토어에서 사라진 앱도 마지막 데이터와 함께 데이터베이스에 남습니다.

인증

/v1/health를 제외한 모든 요청은 헤더에 API 키를 포함해야 합니다:

X-API-Key: ak_live_…

다음도 허용됩니다: Authorization: Bearer …. URL 매개변수로 키를 전달할 수 없습니다. 로그와 브라우저 기록에 남기 때문입니다.

키는 서버에 보관하세요. 페이지 JavaScript에 넣으면 방문자 누구나 복사할 수 있습니다. 프런트엔드 요청은 백엔드를 거치도록 하세요.

크레딧과 한도

각 호출은 응답 행 수(최대 100)와 관계없이 엔드포인트에 따라 0~3크레딧이 듭니다. apps 일괄 호출은 앱당 1크레딧입니다. 이번 달 요금제 크레딧이 먼저 사용되고 그다음 선불 잔액이 사용됩니다. 저희 측 문제로 요청이 실패하면 크레딧은 반환됩니다. 요금제 및 팩

헤더의미
X-Credits-Cost이 요청에 사용된 크레딧
X-Credits-Remaining남은 크레딧(요금제 + 잔액)
X-CacheHIT — 캐시에서 제공(더 빠름), MISS — 인덱스에 새로 조회
X-RateLimit-Limit / -Remaining키의 분당 한도와 남은 양
X-Planfree | pro | scale | business

남은 크레딧은 모든 응답의 _credits 필드와 /v1/account(무료)에서도 확인할 수 있습니다.

응답 형식과 오류

모든 응답에는 ok 필드가 있습니다. 목록에는 results, total, page, per, pages가 포함됩니다. 오류: ok = false, error는 설명, code는 기계가 읽을 수 있는 코드입니다. 날짜는 UTC 기준 ISO 8601 형식입니다.

{ "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. …" }
HTTPcode시점
400invalid_param, invalid_request매개변수가 잘못되었거나 없습니다
401missing_api_key, invalid_api_key키가 없거나 취소되었습니다
402insufficient_credits크레딧 부족 — 충전하거나 요금제를 업그레이드하세요
403account_blocked, plan_required계정이 차단되었거나 엔드포인트에 상위 요금제가 필요합니다
404not_found앱이나 개발자가 데이터베이스에 없거나 엔드포인트를 알 수 없습니다
429rate_limited분당 요청 한도 초과
503service_unavailable일시적인 데이터베이스 문제입니다. 나중에 다시 시도하세요. 크레딧은 차감되지 않습니다

엔드포인트

모든 엔드포인트는 GET /api/v1/{name}입니다. 페이지 나누기: page(1부터)와 per(1–100), 10,000번째 결과까지. 정렬: sort + order=asc|desc.

GET/api/v1/account무료

요금제, 요금제 크레딧과 잔액, 크레딧 초기화 날짜, 분당 한도.

앱
GET/api/v1/app 1크레딧

전체 앱 기록: 제목, 설명, 새로운 기능, 설치 수(구간과 정확한 수), 평점, 평가 및 리뷰 수, 별점 분포, 가격, 인앱 구매, 광고, 카테고리, 콘텐츠 등급, 버전, 최소 Android, 출시일과 업데이트일, 아이콘, 스크린샷, 동영상, 개발자와 웹사이트. 삭제된 앱의 경우: 마지막으로 저장된 데이터와 삭제일.

id *앱 패키지 이름
GET · POST/api/v1/apps 앱당 1크레딧

한 번의 호출로 최대 100개 앱: GET ?ids=a,b,c 또는 본문에 목록을 넣은 POST(한 줄에 하나 또는 JSON {"ids": […]}). 앱당 1크레딧이며, 없는 ID는 not_found로 반환됩니다.

ids *패키지 이름, 쉼표로 구분, 최대 100개
GET/api/v1/suggest 무료

제목 시작 부분 기준 추천: 인기 상위 10개. 무료.

q *제목 시작 부분, 2자 이상
개발자
GET/api/v1/developer 2크레딧

개발자와 모든 앱: 앱 수(등록 중과 삭제됨), 총 설치 수, 평균 평점, 첫 출시, 카테고리, 웹사이트. Business 요금제: 이메일, 전화번호, 주소, 법인명.

id개발자 ID(앱의 developer.id)
name또는 정확한 개발자 이름
statusall(기본값), live 또는 removed
sortrelevance | installs | real_installs | score | ratings | reviews | released | updated | price
page페이지, 1부터
per페이지당 행 수, 1–100(기본값 20)
스토어 변경 사항
GET/api/v1/new 2크레딧

최초 출시일순 신규 앱. 최신순으로 표시됩니다.

since이 날짜부터, YYYY-MM-DD(기본값: 7일 전)
until이 날짜까지(해당일 포함)
category카테고리 ID, 예: GAME_PUZZLE(/v1/categories 참고)
min_installs최소 설치 수(Google Play 구간: 1000, 10000…)
lang제목 언어, ISO 코드: en, de, pt…
sortrelevance | installs | real_installs | score | ratings | reviews | released | updated | price
page페이지, 1부터
per페이지당 행 수, 1–100(기본값 20)
GET/api/v1/removed 2크레딧

Google Play에서 사라진 앱(확인하는 19개 국가 모두에서 없는 앱)을 삭제일순으로 보여 줍니다. 앱 기록에는 마지막 데이터가 남습니다.

since이 날짜부터, YYYY-MM-DD(기본값: 7일 전)
until이 날짜까지(해당일 포함)
category카테고리 ID, 예: GAME_PUZZLE(/v1/categories 참고)
min_installs최소 설치 수(Google Play 구간: 1000, 10000…)
sortremoved_at | installs | score
page페이지, 1부터
per페이지당 행 수, 1–100(기본값 20)
시장
GET/api/v1/keywords 2크레딧

언어별 앱 제목의 단어와 구문: 사용하는 앱과 개발자 수, 그중 강한 앱(설치 10만 회 이상) 수, 총 설치 수, 선두 점유율, 기회 점수.

lang언어, 기본값 en
q단어 또는 구문
phrasetrue — 두 단어 구문만, false — 단일 단어만
min_apps최소 앱 수
max_apps최대 앱 수
sortopportunity | apps | installs | strong | devs | max_installs
orderdesc | asc
page페이지, 1부터
per페이지당 행 수, 1–100(기본값 20)
GET/api/v1/categories 무료

앱 수와 총 설치 수가 포함된 모든 카테고리. 무료.

statuslive(스토어 등록 중, 기본값), removed 또는 all
GET/api/v1/free_domains 3크레딧Pro+

개발자 웹사이트 도메인을 등록할 수 있는 앱과 그 앱의 인기도. Pro 요금제 이상.

category카테고리 ID, 예: GAME_PUZZLE(/v1/categories 참고)
min_installs최소 설치 수(Google Play 구간: 1000, 10000…)
statuslive(스토어 등록 중, 기본값), removed 또는 all
tld도메인 영역, 예: com
sortrelevance | installs | real_installs | score | ratings | reviews | released | updated | price
page페이지, 1부터
per페이지당 행 수, 1–100(기본값 20)
GET/api/v1/charts 2크레딧

한 국가와 카테고리의 Google Play 차트: 최대 200위, 이전 스냅샷 대비 순위 변동(change: 상승한 순위 수, 새로 진입하면 "new"), 아이콘, 설치 수.

country *국가, ISO 코드: US, DE, BR…
category *카테고리, 예: GAME_PUZZLE
collectionfree | paid | grossing
page페이지, 1부터
per페이지당 행 수, 1–100(기본값 20)
GET/api/v1/rankings 1크레딧

최신 스냅샷에서 앱이 올라 있는 모든 차트: 국가, 카테고리, 컬렉션, 순위, 차트 수와 국가 수, 최고 순위.

id *앱 패키지 이름
country한 국가만
collectionfree | paid | grossing
GET/api/v1/availability 1크레딧

Google Play에서 앱이 제공되는 국가(스토어 사이트맵의 hreflang 기준). 190개국 이상이면 목록 없이 worldwide = true가 반환됩니다.

id *앱 패키지 이름
GET/api/v1/markets 1크레딧

무료 차트 기반 시장 경쟁도: 상위 100위와 200위 진입 기준(해당 순위 앱의 설치 수), 상위권의 신규 앱(최근 12개월)과 로컬 앱(3개국 이하) 비중, 로컬 시장 규모. 매개변수 없음: 모든 국가, country: 한 국가의 카테고리, category: 모든 국가의 한 카테고리.

country국가, ISO 코드
category카테고리 ID, 예: GAME_PUZZLE(/v1/categories 참고)
sortentry100 | entry200 | new_share | local_share | local_apps | local_installs | local_new
orderdesc | asc
page페이지, 1부터
per페이지당 행 수, 1–100(기본값 20)
GET/api/v1/stats 무료

데이터베이스 규모: 스토어의 앱과 삭제된 앱, 개발자, 최근 7일간 신규 및 삭제, 마지막 갱신 시각. 무료.

* — 필수 매개변수

코드 예제

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

# curl — puzzle games with 10M+ installs, best rated first
curl -H "X-API-Key: $KEY" "https://apkapi.com/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://apkapi.com/api/v1/apps"
# Python — apps removed from Google Play this week
import os, requests
r = requests.get("https://apkapi.com/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+ (서버에서, 브라우저가 아니라)
const res = await fetch("https://apkapi.com/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://apkapi.com/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;

사용해 보기

키는 계정 페이지에서 만들 수 있습니다. 요청은 브라우저에서 바로 전송됩니다. 키는 어디에도 저장되지 않으며 페이지를 새로고침하면 사라집니다. 콘솔에서 보낸 요청도 일반 요청과 동일하게 크레딧을 사용합니다.