Developers

APKCube API

Search Android apps, see which versions are available and download the APK, either from your own backend or from an AI agent. All three options below share one account and one credit balance.

On this page

Ways in

Quickstart#

Create an API key, send it as a bearer token, and you can start making requests. There is no SDK to install and no separate sandbox.

  • Responses are JSON, and every charged one includes a header showing its cost.
  • The same key works for the REST API, the skill file and the MCP server. MCP clients with a browser can sign in with OAuth instead.
  • /me, /categories and the availability check are free, so you can test a key without spending credits.
Search the catalogue
curl -sS "https://apkcube.com/api/v1/apps?q=whatsapp" \
  -H "Authorization: Bearer $APKCUBE_API_KEY"

Pricing#

You buy credits and each call uses some of them. There are no plans or tiers to upgrade. Prices are set in our code, so they only change with a release and a changelog entry, never in the middle of a running job.

CallCreditsNotes
GET /mefreeCheck that a key works and see its credit balance.
GET /categoriesfreeThe category list used to filter searches.
GET /apps?q=1Search. 24 results per page, up to 60 matches in total.
GET /apps/{pkg}5The full listing for one package.
GET /apps/{pkg}/versions5All builds we have, newest first. Free when we hold no builds for the package (an empty list).
POST /apps/availabilityfreeWhether we have a build of up to 100 packages, each one's newest version, and the code and name of every version we have. For update checkers.
POST /apps/batch1Up to 100 packages in one call. Charged per package.
GET /apps/{pkg}/security5Checksum, scan result, signing certificates and permissions for one build.
GET /apps/{pkg}/sdks5Third-party libraries we detected in a build, and how much of it we could read.
GET /apps/{pkg}/trackers5Only the advertising, analytics and tracking libraries from that list, counted by category.
GET /apps/{pkg}/protection5Whether a build is packed, which limits what the other checks can see.
GET /apps/{pkg}/permissions5Permissions a build declares, with descriptions. Sensitive ones first.
GET /apps/{pkg}/manifest5Manifest settings and native libraries, plus the findings we flag from them.
GET /apps/{pkg}/raw10The raw scan record as stored, including the evidence digest, for running your own rules.
GET /apps/{pkg}/signing5Which key signed each release, and when it changed.
GET /apps/{pkg}/compare1Differences between two builds.
GET /lookup/hash/{hash}5Find the build that matches an MD5, SHA-1 or SHA-256. No package name needed. Free when nothing matches (found: false).
GET /lookup/certificate/{fp}5All packages we have that were signed by a given key. Free when we hold nothing signed by the key (total: 0).
GET /developers/{slug}1All apps from one publisher.
GET /developers/{slug}/certificates5Every signing key behind one publisher's apps, and whether each also signs anyone else's. Free when we hold no signing record for any of the publisher's apps (total: 0).
GET /charts1Hot, grossing, latest, new, editors' choice, and what's popular or freshly updated here.
GET /apps/{pkg}/similar1Apps related to one package. Free when there is nothing to list (an empty items).
GET /apps/{pkg}/play5Google Play's full store listing in any country and language: rating histogram, install estimate, in-app purchase prices, ads, release date.
GET /apps/{pkg}/reviews5One page of Google Play user reviews, with the developer's replies. Free when the page is empty (an empty items).
POST /apps/{pkg}/fetch10Ask us to fetch an app we don't have yet. Charged even when we already have builds (READY) or Google Play doesn't list the app; free only when a fetch for the app is already running (FETCHING).
GET /apps/{pkg}/fetch1Check on a fetch you started. Free when the fetch is still running (FETCHING).
POST /apps/{pkg}/variants10Ask for a build the default download doesn't include: every language, 32-bit ARM, universal, an older Android version or a specific device. Charged even when the variant is already built (READY); free only when a build of that variant is already running (FETCHING).
GET /apps/{pkg}/variants1Check on a variant build. Free when the build is still running (FETCHING).
POST /apps/{pkg}/download10Creates a signed download URL. This is the only call that gives you a file.

Limitations#

Things to know before you build on the API.

Install counts are buckets
Google Play only shows ranges like "10,000,000+", so that is what we return. There is no exact number behind it.
Metadata can lag behind Play
We refresh listings about once a day, so a version can be up to a day behind Google Play. Less popular apps can take longer.
No paid apps
Google Play only delivers a paid app to the account that bought it, so we can't get paid apps we don't already have.
Takedowns apply here too
A removed app returns 451 in the API just like it does on the website. If the block is country-specific, it applies based on where your request comes from.
No webhooks
We don't push updates and there's no SDK. To find out when an app updates, poll the free availability check.