Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

APKCube

REMOTE · APKCUBE.COM

Search Android apps, check APK signing and scans, and get verified APK download links.

Available components

79 Trust /100

Last scanned (7 hours ago)

Scores higher than 79% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Documents and Files

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security89
Transport & Reachability100
Schema Quality & AI Usability79
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 7205 tokens (~200/item across 36 items; 36 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management7
  • Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 36 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 37 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

  • 4 Nov 26 0
    • Stability: unverified → 0.03 ▲ functional
  • 3 Nov 26 78

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://apkcube.com/api/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=apkcube.com CN=WE1,O=Google Trust Services,C=US 20 Oct 2026 18 Jan 2027 ECDSA 256 ECDSA-SHA256 3f0b27081d1aa52c13c1baa1c1116f74
SANs: apkcube.com, icons.apkcube.com, *.icons.apkcube.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of apkcube.com. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
apkcube.com. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://apkcube.com/.well-known/oauth-protected-resource/api/mcp", scope="catalog:read catalog:download"

Bearer resource_metadata="https://apkcube.com/.well-known/oauth-protected-resource/api/mcp", scope="catalog:read catalog:download"
Header Value
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy same-origin
permissions-policy usb=(self)

Protected resource metadata

Document https://apkcube.com/.well-known/oauth-protected-resource/api/mcp
Retrieved Yes
Resource https://apkcube.com/api/mcp
Authorisation server https://apkcube.com

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://apkcube.com/api/mcp Verified 200
http (plaintext) http://apkcube.com/api/mcp HTTPS enforced 301 https://apkcube.com/api/mcp
MCP tools · 36 exposed · ~6,838 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
check_availability ~157

Free. Whether we hold a downloadable build of each of up to 100 packages, the newest one's versionName and versionCode, and `versions`: every build we hold by versionCode and versionName, highest code first — the cheap way to check for updates before calling list_versions or get_download_url. Send every package you are checking in one call rather than looping. Each lands in one of three lists: `items` for packages we know (`available` false when we hold no build), `notFound` for ones we have never seen, and `refused` for ones we will not serve at all, with the reason a download would give.

NameTypeReqDescription
packageNamesarrayyesAndroid package ids, 1–100.
NameTypeReqDescription
itemsarrayyesPackages we know, in the order sent — `available` false when we hold no build.
notFoundarrayyesIds with no row in the catalogue.
refusedarrayyesPackages we will not serve at all, with the reason a download would give.

No examples provided.

compare_versions ~138

What changed between two releases: permissions gained and lost, whether the signing key moved, size and minimum Android. Name either side by version name or by version code — the code is tried first, because a version name is free text the developer sets and is often a placeholder. Order does not matter; the higher build number is treated as the newer. Check `permissionsKnown` before reading two empty permission lists as 'nothing changed'.

NameTypeReqDescription
fromstringyesOne release, by version name or version code.
packageNamestringyesAndroid package id.
tostringyesThe other release, by version name or version code.
NameTypeReqDescription
minSdkobject|null–Minimum Android API level move, when both sides are known and differ.
newCertShasarray–Certificates signing the newer release but not the older one.
noteworthybooleanyesWorth a human's attention: a permission was gained, or the signer moved.
packageNamestringyesThe package compared.
permissionsAddedarray––
permissionsKnownbooleanyesBoth releases had their manifests read. When FALSE the permission arrays are empty because we could not look, not because nothing moved.
permissionsRemovedarray––
previousVersionstringyesThe older of the two.
signerChangestring|null–'same', 'added', 'narrowed', 'changed' or 'replaced'; null when either side's signature was never extracted.
signerChangeDetailstring|null–What it means for whoever installs the build.
signerChangeLabelstring|null–Short reading of `signerChange`.
sizeobject|null–Byte delta for one arch present in both releases. Null when they share none — comparing across differing split sets would report a change that is only a change in what we store.
versionstringyesThe newer of the two, whichever order they were asked for in.

No examples provided.

console_app_stats ~88

Downloads of one of your apps: per UTC day for the last 30 days (with the 30 before for comparison), the lifetime total, and the top countries of the last 7 days. Counts come from our own download log, not Google Play. Free.

NameTypeReqDescription
packageNamestringyesPackage id of an app on your Developers Console team, e.g. com.example.app.
NameTypeReqDescription
countriesobject––
last30integeryesDownloads in the last 30 days.
lifetimeintegeryesAll-time downloads.
packageNamestringyesThe app.
perDayarray––
previous30integer–Downloads in the 30 days before that.

No examples provided.

console_list_apps ~72

The apps you manage in the APKCube Developers Console — every app of every developer whose team you are on, 50 a page, with your role on each. Only works for a signed-in user (OAuth) on a verified developer's team. Free.

NameTypeReqDescription
pageinteger–1-based page.
NameTypeReqDescription
itemsarrayyes–
pageinteger–This page.
perPageinteger–Page size.
totalintegeryesApps across all your teams.

No examples provided.

console_list_uploads ~85

Builds submitted for your apps from the console or the Publishing API, newest first, with each one's status (uploading, verifying, scanning, held, published, rejected …) and, for a held or rejected build, the reason and its stable code. Pass packageName for one app. Free.

NameTypeReqDescription
packageNamestring–Optional: only this app's uploads.
NameTypeReqDescription
itemsarrayyes–
totalinteger–Uploads matched.

No examples provided.

console_security_report ~119

Every build we store for one of your apps with our scan verdict, VirusTotal counts, signature scheme, how its signing key compares with the keys on record, and any notice you have put on it — plus a one-line verdict on the signing history. `verdict: null` means not scanned, which is not the same as clean. The `apkId` here is what console_set_version_notice takes. Free.

NameTypeReqDescription
packageNamestringyesPackage id of an app on your Developers Console team, e.g. com.example.app.
NameTypeReqDescription
packageNamestringyesThe app.
signingobject|null––
versionsarrayyes–

No examples provided.

console_set_version_notice ~222

Put a warning on one stored build of your app — `vulnerable` or `withdrawn`, a message of up to 300 characters, and optionally the version code to use instead — or lift it (`lift: true`). With `blockDownload: true` downloads of that build are refused. Applies immediately and is reversible; it does not delete anything. Take `apkId` from console_security_report. Needs the uploader role or above.

NameTypeReqDescription
apkIdstringyesThe stored build's apkId, from console_security_report.
blockDownloadboolean–Also refuse downloads of this build.
kindstring–Why the build is pulled.
liftboolean–True removes the notice; the fields below are ignored.
messagestring–Shown to visitors, up to 300 characters.
packageNamestringyesPackage id of an app on your Developers Console team, e.g. com.example.app.
recommendedVersionCodeinteger–Optional: the version code visitors should take instead.
NameTypeReqDescription
apkIdstringyesThe build.
liftedboolean––
noticeobject|null––
packageNamestringyesThe app.

No examples provided.

console_update_listing ~194

Change the text visitors read on your app's page: the short description (≤80 characters), full description (≤4000, plain text), what's new (≤500) and a YouTube link. Omit a field to keep it; pass null or an empty string to show Google Play's text for it. Goes live immediately; our moderators review afterwards. Needs the admin or owner role. Name and icon cannot be changed.

NameTypeReqDescription
descriptionstring–Full description, plain text, up to 4000 characters.
packageNamestringyesPackage id of an app on your Developers Console team, e.g. com.example.app.
recentChangesstring–What's new in the current release, up to 500 characters.
summarystring–Short description, up to 80 characters.
videoUrlstring–A youtube.com/watch?v= or youtu.be link.
NameTypeReqDescription
listingobjectyes–
packageNamestringyesThe app.

No examples provided.

console_upload_status ~87

Where one upload stands, with the scan summary once it has one (VirusTotal counts, signing certificates and how each compares with the keys on record). Poll every 15–30 seconds while status is verifying, scanning or publishing; `held` waits for a person and can take days. Free.

NameTypeReqDescription
uploadIdintegeryesThe upload's id, from console_list_uploads.
NameTypeReqDescription
scanobject|null––
uploadobjectyes–

No examples provided.

get_account ~76

How many credits are left on the key you are using, and what that key is. Free. Every successful call also reports this in `_meta`, so reach for this one when you need to know before you spend — a download costs 10 — or when your calls have been failing and you have not seen a balance in a while.

Input schema present but exposes no named parameters.

NameTypeReqDescription
creditsintegeryesCredits left on the account this key bills to, after this call.
keyIdstringyesId of the credential that made this call, as `<kind>:<id>` — `key:` for an API key, `oauth:` for an MCP client's OAuth grant. Treat it as an opaque string: it identifies the credential, not the accou…
memberSincestringyesWhen the account was created.

No examples provided.

get_app ~116

Full record for one package: description, screenshots, rating, tags, and whether a download would be refused. Does NOT list downloadable files — use list_versions for those. An app not in the catalogue yet is looked up on Google Play live, for up to 20 seconds; UPSTREAM_UNAVAILABLE / UPSTREAM_BUSY then is refunded and means Play did not answer in time, not that the app does not exist — retry after a few seconds.

NameTypeReqDescription
packageNamestringyesAndroid package id, e.g. com.whatsapp.
NameTypeReqDescription
availabilitystringyes'unavailable' means a download call will be refused — a takedown, a paid app we cannot obtain, or a listing under the operator's rating bar.
categoryIdstring–Category id, as listed by the categories call.
categoryNamestring–Human-readable category.
descriptionarray–Plain-text paragraphs.
descriptionHtmlstring|null–Sanitised store markup.
developerstringyesPublisher name as scraped.
developerSlugstring|null–Key for the developer lookup. Null when the row has no publisher.
developerVerifiedboolean–The publisher is verified on this site through the Developers Console (it proved it owns the Play listing, or an operator approved a publisher that is not on Google Play); the text fields may then be…
editorsChoiceboolean–Carries Play's Editors' Choice badge.
hasFilesbooleanyesWe hold at least one downloadable file. Check before spending a download.
headerImagestring|null–Wide feature graphic.
iconUrlstring|null–Store artwork URL.
installsstring|null–Google Play's install BUCKET, verbatim ('10,000,000+'). A string, not a number — Play publishes no exact count. Null when the app is not on Google Play.
namestringyesApp title.
onGooglePlayboolean–False for an app its developer published on this site directly, with no Google Play listing: the Play fields are then null and the Play listing call answers 404.
packageNamestringyesAndroid package id — the identifier every app call takes.
paidboolean–Paid on Google Play.
priceobject|null–Play's asking price. Null for a free listing.
ratingnumber|null–Play star rating, 0–5. Null when the app is not on Google Play, or when Play gave it no rating.
ratingsinteger|null–Vote count behind `rating`. Null on rows seeded from a list scrape.
recentChangesstring|null–Play's 'What's new'.
requiresAndroidstring–Minimum Android, as Play states it ('5.0 and up').
screenshotsarray––
summarystringyesOne-line store summary.
tagsarray––
typestringyesGame or app.
updatedAtstring|null–When Play last published an update, ISO 8601.
versionstring–Latest version NAME known ('2.24.9'). May be 'Varies with device'.
videoUrlstring|null–Promo video, when Play lists one.

No examples provided.

get_apps ~134

Summary rows for up to 100 package ids in one call — use this instead of calling get_app in a loop. Costs 1 credit PER PACKAGE, so a hundred ids cost a hundred credits however they arrive. Ids we do not hold come back in `notFound` rather than failing the call. Returns the SUMMARY row, not the full record: it is cheaper than get_app (5) because it answers less, so reach for get_app only when you need the description or the screenshots for a particular one.

NameTypeReqDescription
packageNamesarrayyesAndroid package ids, 1–100. Charged per id.
NameTypeReqDescription
itemsarrayyes–
notFoundarrayyesIds with no row in the catalogue.

No examples provided.

get_download_url ~185

Mint a short-lived signed URL for one build — the newest held unless you pass an apkId from list_versions. Costs 10 credits — the most expensive call here, and the only one that hands over a file. Check get_version_security before handing anything to a person. The URL expires in about 5 minutes; fetch it promptly and do not store it. The response carries the file's `sha256` — verify what you downloaded against it, because the signature is on the URL and not on the bytes.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
variantIdstring–Optional: an on-demand variant build of that release, from get_variant_status. It is served under the ordinary build's checks; omit it for the ordinary build.
NameTypeReqDescription
apkIdstringyesThe artifact that was minted.
appNamestringyesThe app's display name.
expiresAtstringyesWhen `url` stops working.
fileSizeinteger–Bytes.
formatstring–'apk', 'xapk' or 'apks' — the container `url` serves.
packageNamestringyesPackage this file belongs to.
sha256stringyesSHA-256 of the file this URL serves, lowercase hex. Verify the download against it.
urlstringyesSigned URL, valid about 5 minutes. Fetch it before it expires.
variantIdstring–Present when an on-demand variant build was minted; `fileSize` and `sha256` are then the variant's.
versionCodeinteger–Build number of the minted build.
versionNamestring–Version string of the minted build.

No examples provided.

get_fetch_status ~114

Where the fetch request_fetch started stands now: FETCHING (keep waiting), READY (call list_versions), or FAILED with a reason. Free when the fetch is still running (`FETCHING`); the final answer costs 1 credit, and so does a check when no fetch was requested (`FETCH_NOT_FOUND`). When FAILED carries `terminal: true`, Google Play will not deliver this app to us and asking again will not help; otherwise request_fetch may be retried.

NameTypeReqDescription
packageNamestringyesAndroid package id.
NameTypeReqDescription
errorstring–FAILED only: why, in words safe to show a person.
packageNamestringyesThe package this fetch is for.
statusstringyesREADY: we hold builds — list the versions. FETCHING: a job is queued or running; poll again in a few seconds. FAILED: the last job failed; see `error`.
terminalboolean–FAILED only, and present only when retrying cannot help: Google Play will not deliver this app to us. Absent means another fetch request may succeed.
updatedAtstring–Status read only: when the job last moved.

No examples provided.

get_manifest ~226

What the artifact's own AndroidManifest.xml says beyond the permissions it requests — targetSdk, compileSdk, debuggable, cleartext traffic, backup, sharedUserId, install location, uses-feature, uses-library, and the components it exports without a permission guard — plus the native libraries it ships, and our rules read off the pair as `findings`. Defaults to the newest build. A KEY ABSENT INSIDE `manifest` means the manifest is silent about that attribute, never that it declares the platform default; `manifest: null` means nobody read it at all, and an empty `findings` beside that is not an all-clear. `versionMismatch` is the one to escalate: non-null means the file's own version disagrees with what the listing claims, which is what a swapped or relabelled artifact looks like. Use get_raw_scan if you want the stored record without our rules applied.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
NameTypeReqDescription
apkIdstringyesThe build this describes — the one asked for, or the newest held.
findingsarrayyesOur rules read off the two fields above, warnings first. Empty is NOT an all-clear: absence is never a finding, so a manifest nobody read produces none either — manifest:null beside it is how to tell.
manifestobject|nullyesWhat AndroidManifest.xml declares beyond the permissions it requests: targetSdk, compileSdk, debuggable, usesCleartextTraffic, allowBackup, sharedUserId, installLocation, definesPermissions, usesFeat…
nativesobject|nullyesNative libraries the artifact ships: abis, libs (name, largest uncompressed size, the abis carrying it) and protectors. NULL = the archive directory could not be read; empty lists are the factual 'sh…
packageNamestringyesThe package asked for.
versionCodeintegeryesIts build number.
versionMismatchobject|nullyesThe artifact's own version against what the listing claimed for it, as {claimed, actual}. Non-null means the bytes are not the build the listing describes — a swapped or relabelled artifact — and it…
versionNamestringyesVersion name of that build.

No examples provided.

get_play_details ~207

Google Play's full store listing for one package, in any storefront: the star histogram, install estimate, IAP price range, release date, declared permissions, content-rating descriptors, legal publisher and contact details — the store data get_app leaves out. Usually null: the written-review count, sale pricing and the Play Pass and pre-registration flags. Pass `lang`/`country` for another storefront (prices, text and availability differ); the default en/us listing is served from our own scrape while it is fresh and scraped and stored otherwise. Works for packages outside the catalogue. Charged even when Google Play doesn't list the app (`APP_NOT_FOUND`); a busy or failed Google Play is refunded.

NameTypeReqDescription
countrystring–Two-letter storefront country, e.g. us, jp. Defaults to us.
langstring–Language code, e.g. en, ja, pt-BR. Defaults to en.
packageNamestringyesAndroid package id.
NameTypeReqDescription
contentRatingstring|null–E.g. 'Teen'.
contentRatingDescriptionstring|null–E.g. 'Mild Violence'.
countrystringyesStorefront country the listing was read from.
developerobjectyes–
fetchedAtstringyesWhen Google Play produced this listing, ISO 8601.
genrestring|null–Store genre label, e.g. 'Strategy'.
genreIdstring|null–Store genre id, e.g. 'GAME_STRATEGY'.
installsobjectyes–
langstringyesLanguage the listing was read in.
minAndroidVersionstring|null–Machine form, e.g. '5.0' or 'VARY'.
minAndroidVersionTextstring|null–Store sentence, e.g. '5.0 and up'.
packageNamestringyesThe package.
permissionsarray|nullyesPermissions as the store lists them. Null when this listing's source does not publish them — the per-build manifest has the authoritative list.
pricingobjectyes–
privacyPolicyUrlstring|null–Privacy policy link.
ratingobjectyes–
recentChangesstring|null–What's new.
releasedstring|null–First publication, as the store prints it.
sourcestringyes`catalog`: the stored en/us listing, at most a day old. `live`: asked of Google Play for this call or a recent one.
summarystring|null–Short promo text.
titlestringyesStore title.
updatedAtstring|null–Last update, ISO 8601.
urlstring|null–The store page.
versionstring|null–Current version name.

No examples provided.

get_protection ~248

Whether this build is wrapped in a commercial protector — DexProtector, Jiagu, Bangcle, Legu, AppSealing, Google's own PairIP — and what that means for everything else you can find out about it. Defaults to the newest build. A PROTECTOR IS NOT A MALWARE SIGNAL: anti-piracy, anti-tamper and anti-cheat are what these are sold for, and saying an app is 'suspicious' because it is packed is wrong about a large part of the catalogue. What it does mean is that the app's real code is not in classes.dex for anyone to read, so an empty SDK list, a short permission list or any other analysis of the same artifact is a floor and not a census — call this BEFORE you report that a build carries no trackers. `analyzed: false` means the archive was never opened, which is not the same as an unpacked build. Relay `summary` whole: it carries the finding and the bound in one sentence.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
NameTypeReqDescription
analyzedbooleanyesWas the artifact ever opened? FALSE means every field below is a default and none of them is a finding.
apkIdstringyesThe build this describes — the one asked for, or the newest held.
cappedarray–Evidence tiers that hit their size cap while the artifact was being read, so the analysis worked from a subset of what the file carries. The one bound no later corpus can repair — fixing it needs the…
codeCoveragestringyesHow far the analysis reached into the app's OWN code: none — only the manifest and bundled libraries were read; partial — the code was read but not through; full — read through. Only 'full' makes an…
dexobject|null–How much code was read, when any was: read of total dex files, bytes, and truncated (one file ran out of budget part-way). NULL when none was read.
packageNamestringyesThe package asked for.
pairipbooleanyesGoogle PairIP licence protection specifically. Beyond packing, it checks the app's licence at run time, so a plain sideload of the file may refuse to run.
protectedbooleanyesAt least one commercial protector was identified. FALSE with analyzed:false above it means nobody looked — not that the build is unpacked.
protectorsarrayyesWhat was identified. NOT a malware signal — anti-piracy and anti-tamper are what these are sold for, Google's own PairIP included. What it does mean is that the app's real code is not in classes.dex…
summarystringyesOne sentence carrying both halves — what was found, and what it bounds. Relay it whole: 'packed with Jiagu' on its own turns a build-tool choice into an accusation, and the second clause is the part…
versionCodeintegeryesIts build number.
versionNamestringyesVersion name of that build.

No examples provided.

get_raw_scan ~204

The whole stored analysis record for one build, exactly as stored and with none of our rules applied — for when you want to judge the facts yourself rather than read our conclusions. It carries two things no other tool publishes: the EVIDENCE DIGEST every SDK match is drawn from (dex package prefixes, manifest component names, intent actions, how much code was read), so you can match it against your own corpus; and each signing certificate's serial and signature algorithm. Also the raw VirusTotal counters and every flagging vendor. Prefer the narrower tools when you want an answer — get_version_security, get_protection, list_trackers, list_permissions, get_manifest — and reach for this when you want the inputs. A build nobody has scanned is `scanned: false`, which is not a clean result.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
NameTypeReqDescription
apkIdstringyesThe build this describes — the one asked for, or the newest held.
certsarrayyesEvery signer certificate found, with the full X.509 detail — including the serial and the certificate's own signature algorithm, which the projected signer shape does not carry. Empty on scans that p…
evidenceobject|nullyesWhat the scan SAW, with no judgement in it: dex package prefixes truncated at `depth`, manifest component class names, intent actions, how much code was read, and which tiers were capped. Every SDK m…
evidenceVersioninteger|null–Which digest schema produced `evidence`.
manifestobject|nullyesThe manifest facts as stored. Same object the manifest endpoint publishes.
md5string|null–MD5 of the same artifact. An identifier for matching a published IOC, never an integrity check.
nativesobject|nullyesThe native inventory as stored: abis, libs, protectors.
packageNamestringyesThe package asked for.
pairipboolean|null–Google PairIP detected. NULL = not reported by the engine that scanned this.
permissionsarray|nullyesRaw manifest permission names, unlabelled and in the manifest's own order. NULL = the manifest was never read; [] = it declares none.
scannedbooleanyesA scan record exists. FALSE and everything below is null or empty — none of which means clean.
scannedAtstring|null–ISO 8601.
sha1string|null–SHA-1 of the same artifact, ours where we computed one, else VirusTotal's.
sha256stringyesThe artifact's SHA-256, from the version row — the bytes a download serves.
signatureobjectyesThe legacy single-signer columns, kept because scans predating multi-signature support have these and an empty `certs`.
statusstring|null–Queue state of the record: PENDING | ACTIVE | COMPLETED | FAILED. Only COMPLETED is a finished analysis; FAILED is one that will not finish, and its stored facts are whatever completed before it stop…
verdictstring|null–Our classification, as stored: verified | secure | caution | dangerous | unverified | pending.
versionCodeintegeryesIts build number.
versionNamestringyesVersion name of that build.
virusTotalobjectyesThe counters verbatim, every vendor that flagged the file, and the submission context. found:false means VirusTotal had no report for this hash, which is not a clean result.

No examples provided.

get_signing_history ~119

Which certificate signed which releases of a package, and where the key moved. Android will only install an update signed by the key that signed what is already on the device, so a `hasKeyReplacement: true` means the newer build is not an update of the older one — it is a different app under the same package name, which is what a repackaged app looks like. `unreadVersions` lists releases whose signature we never read; those are gaps, not agreement.

NameTypeReqDescription
packageNamestringyesAndroid package id.
NameTypeReqDescription
erasarrayyesNewest era first.
hasKeyReplacementbooleanyesAt least one era shares no key with the era before it. Android will not install such a build over the existing app, and a key that changed without a rotation is the strongest repackaging signal there…
packageNamestringyesThe package this timeline covers.
signersarray–Certificates on record for the package.
summarystringyesOne sentence naming what the timeline shows.
unreadVersionsarrayyesReleases whose signing block was never read. A gap in coverage, published as a gap so it is not mistaken for agreement.

No examples provided.

get_variant_status ~553

Where one variant of an app stands: READY with the build (its `variantId` goes to get_download_url), FETCHING (keep waiting, 10–30 seconds between checks), FAILED with a reason (request_variant retries), or NEEDS_FETCH (nobody has asked for it, or it expired — call request_variant). Free when the build is still running (`FETCHING`); any other answer costs 1 credit, including when nobody has requested that variant (`NEEDS_FETCH`).

NameTypeReqDescription
packageNamestringyesAndroid package id.
variantstringyesWhich build: `<arch>[+all-langs][@sdkNN|@vcN]` with arch one of arm64-v8a, armeabi-v7a, universal, or `device:<slug>[+all-langs]`. Plain `arm64-v8a` is the ordinary build and not a variant. `+all-lan…
NameTypeReqDescription
buildobject––
errorstring–FAILED only: why, in words safe to show a person.
packageNamestringyesThe package.
statusstringyesREADY: `build` is live — mint it. FETCHING: being built; poll again in 10–30 seconds. FAILED: the last build failed, see `error`; requesting again retries. NEEDS_FETCH (status only): nobody has asked…
variantstringyesThe variant asked about.

No examples provided.

get_version_security ~260

What one build actually IS: its SHA-256, the anti-malware verdict, the certificates that signed it, and every Android permission it declares with a plain-English gloss. Defaults to the newest build, so you do not need list_versions first. `findings` is the part to read first: it applies our rules to the manifest and native facts on the same response and names what they imply — a debuggable build, a version that disagrees with the listing, cleartext traffic, components any app on the device can start, a packer. Two severities, `warning` and `notice`, and NEITHER is a verdict; an empty `findings` is not an all-clear, because a manifest nobody read produces no findings either. Read this BEFORE recommending an install, and read the nulls carefully — `scanned: false` and `virusTotal: null` mean nobody has looked, which is not the same as clean, and `permissions: null` means the manifest was never read, which is not the same as an app that asks for nothing.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
NameTypeReqDescription
apkIdstringyesThe build this describes — the one asked for, or the newest held.
findingsarray–What manifest and natives already imply, read for a caller who should not have to know Android to notice it. EMPTY IS NOT AN ALL-CLEAR: absence is never a finding, so an empty array also covers the c…
manifestobject|null–What the artifact's own AndroidManifest.xml declares beyond the permissions it requests: targetSdk, compileSdk, debuggable, usesCleartextTraffic, allowBackup, sharedUserId, installLocation, the permi…
md5string|null–MD5 of the artifact, computed at ingest. Null on builds ingested before it was computed — never a claim the file has no MD5.
nativesobject|null–Native libraries the artifact ships: abis, libs (name, largest uncompressed size, the ABIs carrying it) and protectors. NULL means the archive's directory could not be read; empty lists are the factu…
packageNamestringyesThe package asked for.
pairipboolean–Google PairIP licence protection, which breaks a plain sideload. The same signal reaches natives.protectors as the id 'pairip' when the native walk ran; this field is the scan's own boolean and answe…
permissionSummarystring|null–'24 declared · 5 sensitive'. Null whenever `permissions` is.
permissionsarray|null–NULL means the manifest was never read — not that the app declares none. An empty array is the genuine 'declares none'.
scannedbooleanyesSomething has analysed this artifact. When false, every field below is null or zero and NONE of it means 'clean'.
scannedAtstring|null–When the analysis ran, ISO 8601.
sha1string|null–SHA-1 of the artifact, when one was reported. Computed at ingest where available, else taken from the VirusTotal report. An identifier for matching a published IOC — sha256 is the integrity check.
sha256stringyesSHA-256 of the artifact. The same value the version list and the download call publish.
signatureobject|null–Signature validation. Null when that stage did not run.
verdictstringyesOur overall reading of the artifact.
versionCodeintegeryesIts build number.
versionNamestringyesVersion name of that build.
virusTotalobject|null–Anti-malware analysis for this hash. NULL means nobody has looked — only a non-null object with flagged: 0 is an all-clear.

No examples provided.

list_categories ~25

The category taxonomy, for filtering a search. Free — this call costs no credits.

Input schema present but exposes no named parameters.

NameTypeReqDescription
categoriesarrayyes–

No examples provided.

list_chart ~182

A ranked section of the catalogue. Google Play's charts (hot, grossing, latest, editors-choice), the catalogue's newest releases (new), what people downloaded here in about the last day (popular), or the newest builds we stored (updated). An unrecognised section falls back to 'hot' rather than failing.

NameTypeReqDescription
limitinteger–Rows to return, 1–50. Defaults to 24.
sectionstring–Which chart. hot, grossing, latest and editors-choice are Google Play's charts; new is the catalogue's newest releases; popular is what people downloaded here in about the last day; updated is the ne…
typestring–Restrict to games or apps. Ignored by `popular`, which is one mixed list.
NameTypeReqDescription
itemsarrayyes–
sectionstringyesThe chart that was returned.

No examples provided.

list_developer_apps ~88

Every app we hold from one publisher, most-installed first. The slug comes from `developerSlug` on any app row.

NameTypeReqDescription
pageinteger–1-based page. Defaults to 1.
perinteger–Rows per page, 1–96. Defaults to 24.
slugstringyesPublisher slug, from an app's developerSlug field.
NameTypeReqDescription
developerobjectyes–
itemsarrayyes–
pageinteger–1-based page number of this result.
perPageinteger–Rows per page.
totalinteger–Total matching rows across all pages.
totalPagesinteger–Number of pages available.

No examples provided.

list_developer_certificates ~176

Every signing key on record for one publisher's apps — lookup_certificate read the other way round. Each key says how many of the publisher's apps it signs and, in `elsewhere`, how many packages OUTSIDE the publisher it is also on: zero is ordinary, above zero is a key shared across the publisher's accounts or somebody else's builds signed with it, and lookup_certificate on that fingerprint lists which. All keys in one answer, no pages. BOUNDED, and `note` says how: it covers the publisher's apps we have ingested and scanned. Free when we hold no signing record for any of the publisher's apps (`total: 0`). The slug comes from `developerSlug` on any app row.

NameTypeReqDescription
slugstringyesPublisher slug, from an app's developerSlug field.
NameTypeReqDescription
developerobjectyes–
itemsarrayyesThe key on the most apps first.
notestringyesWhat this answer is drawn from and therefore what it does not cover: the signing record we keep per package, so it covers this publisher's apps we hold files for and have scanned, and `elsewhere` cou…
totalintegeryesKeys in `items`. Every one — not paged; a publisher has a handful.

No examples provided.

list_permissions ~191

Every Android permission this build declares, sensitive ones first, each with a readable label, its capability family and a sentence saying what the app can actually do with it. Defaults to the newest build. This is the same labelling compare_versions diffs, so the two cannot name the same permission differently. THE NULL IS THE PART TO READ: `permissions: null` means the manifest was never read and is NOT a claim that the app asks for nothing — an empty array is that claim. `sensitive` is the count worth quoting; a long list of ordinary permissions is what almost every app looks like. `defines` is separate and often misread: those are permissions this app declares for OTHER apps to hold, not things it is asking for.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
NameTypeReqDescription
apkIdstringyesThe build this describes — the one asked for, or the newest held.
byCategoryarrayyesCounts by capability family, most-declared first, each with how many of its names are sensitive — a family of eleven with none sensitive is a different shape of app from two that are both dangerous.
declaredinteger|null–How many. Null when permissions is.
definesarrayyesPermissions this app DEFINES for other apps to hold — a different thing from the ones it requests. Empty when it defines none, and also empty when no manifest was read: permissions:null is how to tel…
packageNamestringyesThe package asked for.
permissionsarray|nullyesSensitive first, then by label. NULL means the manifest was never read — NOT that the app declares none. An empty array is the genuine 'declares none', and the two are opposite answers to the only qu…
sensitiveinteger|null–Of those, how many are Android-dangerous or special-access. This is the number worth reading.
summarystring|null–'24 declared · 5 sensitive'. Null whenever permissions is.
versionCodeintegeryesIts build number.
versionNamestringyesVersion name of that build.

No examples provided.

list_reviews ~245

One page of Google Play user reviews for a package, live: stars, text, helpful votes, the app version the reviewer ran, and the developer's reply. Sort by newest (default), rating or helpfulness; up to 100 a page. Walk further pages by passing `nextCursor` back as `cursor` with the same sort, num and storefront — each page is a separate charge, so ask for what you need. Free when the page is empty (an empty `items`); a busy or failed Google Play is refunded.

NameTypeReqDescription
countrystring–Two-letter storefront country, e.g. us, jp. Defaults to us.
cursorstring–`nextCursor` from the previous page. Omit for the first page; keep sort, num and the storefront the same while walking.
langstring–Language code, e.g. en, ja, pt-BR. Defaults to en.
numinteger–Reviews per page, 1–100. Defaults to 40.
packageNamestringyesAndroid package id.
sortstring–newest (default), rating, or helpfulness.
NameTypeReqDescription
countrystringyesStorefront country.
fetchedAtstringyesWhen Google Play produced this page, ISO 8601.
itemsarrayyes–
langstringyesLanguage the reviews were read in.
nextCursorstring|nullyesPass back as `cursor` for the next page, with the same sort, num and storefront. Null at the end.
packageNamestringyesThe package.
sortstringyesOrder of `items`.

No examples provided.

list_sdks ~244

What OTHER companies' code is inside an app: the ad, analytics, attribution, crash-reporting, push and sign-in libraries matched in the build, each with its vendor and where it was recognised. Defaults to the newest build. This is the privacy question, not the safety one — these libraries are ordinary parts of shipping an app, so report them as what the app carries and never as evidence of harm. READ THE BOUNDS BEFORE THE LIST: `analyzed: false` means nobody looked; `codeCoverage` says whether the app's own code was read at all, and in full; a non-empty `protectors` means the build is packed and its real code was never open to inspection. An empty `sdks` is only close to 'none' when `analyzed` is true and `codeCoverage` is `full`. Relay `summary` whole — it states the finding and its bound in one sentence, and dropping the second half is the standard way to get this wrong.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
NameTypeReqDescription
analyzedbooleanyesWas this build's evidence ever collected? FALSE means nobody looked, and the empty list beside it says nothing about the app. TRUE with an empty list is the factual 'we looked and recognised none' —…
apkIdstringyesThe build this describes — the one asked for, or the newest held.
byCategoryarray–Counts per category, same order. Empty when sdks is.
cappedarray–Evidence tiers that hit their size cap while the artifact was being read, so the analysis worked from a subset of what the file carries. The one bound no later corpus can repair — fixing it needs the…
codeCoveragestringyesHow far the analysis reached into the app's OWN code: none — only the manifest and bundled libraries were read; partial — the code was read but not through; full — read through. Only 'full' makes an…
completebooleanyesThe answer is bounded by none of the above: code read through, nothing capped, no protector. FALSE is the normal case and is not an error — it means this list is a floor, not a census.
dexobject|null–How much code was read, when any was: read of total dex files, bytes, and truncated (one file ran out of budget part-way). NULL when none was read.
packageNamestringyesThe package asked for.
protectorsarray–Commercial protectors on the build, by product name. NOT a malware signal — anti-piracy and anti-tamper are what they are sold for, Google's PairIP included — but a packed app's real code is not in c…
rulesstring|null–The corpus version that answered THIS request. Matching runs at read time against stored evidence, so two calls either side of a deploy may legitimately name a library the earlier one could not: the…
sdksarrayyesOrdered by category (advertising first, unclassified last), then name.
sourcesarray–Evidence classes actually SEARCHED — manifest, natives, dex — not what was found. Empty when analyzed is false. This is the field that separates 'we looked and found nothing' from 'we never looked'.
summarystringyesOne sentence stating the finding AND its bound. Relay both halves: 'none found' without 'and the code was not read' is the misreading this whole shape exists to prevent.
versionCodeintegeryesIts build number.
versionNamestringyesVersion name of that build.

No examples provided.

list_similar_apps ~92

Apps related to one package — alternatives and neighbours, as the app's page on the site shows them. Free when there is nothing to list (an empty `items`). A package that is not in the catalogue is a 404 rather than a guess.

NameTypeReqDescription
limitinteger–Rows to return, 1–24. Defaults to 8.
packageNamestringyesAndroid package id.
NameTypeReqDescription
itemsarrayyes–
packageNamestringyesThe package these are related to.

No examples provided.

list_trackers ~257

The privacy question on its own: which advertising, analytics, install-attribution, crash-reporting, push and social sign-in SDKs are in this build, and nothing else. `list_sdks` is the same evidence unfiltered — every recognised library including HTTP clients and UI toolkits — so use that one when you want the full inventory and this one when somebody asked what an app sends about them. A CATEGORY IS NOT AN ACCUSATION: all six are ordinary parts of shipping an app, and `unclassified` counts recognised libraries that are neither (unclassified means we take no position, never that a library is harmless). READ THE BOUNDS BEFORE THE LIST: `analyzed: false` means nobody looked; `codeCoverage` says whether the app's own code was read at all and in full; a non-empty `protectors` means the real code was never readable, and an empty list under one says nothing about the app. Relay `summary` whole — 'no trackers found' without its second clause is the standard way to get this wrong.

NameTypeReqDescription
apkIdstring–A specific build from list_versions. Omit for the newest one.
packageNamestringyesAndroid package id.
NameTypeReqDescription
analyzedbooleanyesWas this build's evidence ever collected? FALSE means nobody looked, and the empty list beside it says nothing about the app. TRUE with an empty list is the factual 'we looked and recognised none' —…
apkIdstringyesThe build this describes — the one asked for, or the newest held.
byCategoryarrayyesCounts per category, same order. Empty when the list is.
cappedarray–Evidence tiers that hit their size cap while the artifact was being read, so the analysis worked from a subset of what the file carries. The one bound no later corpus can repair — fixing it needs the…
codeCoveragestringyesHow far the analysis reached into the app's OWN code: none — only the manifest and bundled libraries were read; partial — the code was read but not through; full — read through. Only 'full' makes an…
completebooleanyesThe answer is bounded by none of the above: code read through, nothing capped, no protector. FALSE is the normal case and is not an error — it means this list is a floor, not a census.
dexobject|null–How much code was read, when any was: read of total dex files, bytes, and truncated (one file ran out of budget part-way). NULL when none was read.
packageNamestringyesThe package asked for.
protectorsarray–Commercial protectors on the build, by product name. NOT a malware signal — anti-piracy and anti-tamper are what they are sold for, Google's PairIP included — but a packed app's real code is not in c…
rulesstring|null–The corpus version that answered THIS request. Matching runs at read time against stored evidence, so two calls either side of a deploy may legitimately name a library the earlier one could not: the…
sourcesarray–Evidence classes actually SEARCHED — manifest, natives, dex — not what was found. Empty when analyzed is false. This is the field that separates 'we looked and found nothing' from 'we never looked'.
summarystringyesOne sentence stating the finding AND its bound. Relay both halves: 'no trackers found' without 'and the code was not read' is the misreading this shape exists to prevent, and on a packed build it is…
totalintegeryesClassified libraries found — the number to quote.
trackersarrayyesClassified libraries only — advertising, analytics, install attribution, crash reporting, push messaging, social sign-in. Ordered by category, then name.
unclassifiedintegeryesRecognised libraries we do NOT classify as trackers: HTTP clients, UI toolkits, anything with nothing to classify. Counted rather than listed, so the difference from the SDK inventory's total is visi…
versionCodeintegeryesIts build number.
versionNamestringyesVersion name of that build.

No examples provided.

list_versions ~122

Every APK/XAPK build held for a package, newest first, each with its SHA-256. Call this before get_download_url when you want a specific build — the apkId it returns is what that tool takes; without one it serves the newest. Free when we hold no builds for the package (an empty list); request_fetch is how to get the app. A package we will not serve at all is refused here with the same reason a download would give, so you learn it without spending a download.

NameTypeReqDescription
packageNamestringyesAndroid package id.
NameTypeReqDescription
appNamestring|nullyesThe app's display name. Null only when we have no row for the package.
packageNamestringyesThe package these builds belong to.
versionsarrayyes–

No examples provided.

lookup_certificate ~329

Every package we hold that one signing certificate is on record for. Android only installs an update signed by the key that signed what is already on the device, which makes the signing key the closest thing an app has to an identity across package names — so a key you found on one repackaged app is worth asking about, because it has usually signed others. Takes the SHA-256 fingerprint of the DER certificate (64 hex, colons and case fine). A SHA-1 IS REFUSED, free, with the reason: the record stores one fingerprint per certificate and a SHA-1 cannot be resolved to it — get the SHA-256 (keytool prints both). BOUNDED, and `note` says how: it covers packages we have ingested and scanned, never every app the key has signed, so it is free when we hold nothing signed by the key (`total: 0`), which is not to say the key signs nothing; charged even when every package the key signed has been removed (an empty `items`). `blocked: true` means the key is on our catalogue-wide blocklist and nothing it signed can be downloaded here. Taken-down packages are counted in `blockedCount` and not listed, so a page may be shorter than `perPage`.

NameTypeReqDescription
fingerprintstringyesSHA-256 fingerprint of the signing certificate, 64 hex characters, with or without colons.
pageinteger–1-based page. Defaults to 1.
perinteger–Rows per page, 1–96. Defaults to 24.
NameTypeReqDescription
algorithmstringyesAlways sha256. The per-package signing record stores that one fingerprint, and a SHA-1 cannot be resolved to it — sending one is refused with that reason, free.
blockedbooleanyesThis key is on the catalogue-wide signature blocklist: a download of anything it signed is refused whatever the anti-malware result said.
blockedCountintegeryesPackages this key is on record for that are taken down. Counted across the whole key, not this page, and withheld from `items` — a lookup is not a way to read back what has been removed.
fingerprintstringyesThe fingerprint as matched: lowercase hex, no separators.
itemsarrayyesNewest record first.
notestringyesWhat this answer is drawn from and therefore what it does not cover: the signing record we keep per package, so it covers packages we hold files for and have scanned — never every app the key has sig…
pageintegeryes1-based page number of this result.
perPageintegeryesRows per page.
subjectstring|nullyesSubject as recorded, e.g. 'CN=Example, O=Example Ltd'.
totalintegeryesTotal matching rows across all pages.
totalPagesintegeryesNumber of pages available.

No examples provided.

lookup_hash ~247

Which app and which build a file checksum names. Use this when you have a hash and no package name — an APK pulled off a device, a sample from a threat feed, a digest in an incident report. Takes an MD5 (32 hex), SHA-1 (40) or SHA-256 (64) and works out which from the length, so do not try to label it; colons, spaces and upper case are fine and are normalised. A miss is a real answer, not an error, and it is free when nothing matches (`found: false`): we hold no build with that checksum, and says nothing about whether the file exists elsewhere. READ `note`: only SHA-256 is carried by every stored build, so a SHA-1 or MD5 miss can mean we hold the file and never computed that digest for it — re-check with the SHA-256 if you have it. Once you have the packageName and apkId, the per-build tools will tell you what the file is.

NameTypeReqDescription
hashstringyesAn MD5, SHA-1 or SHA-256 hex digest of the file. The algorithm is taken from its length.
NameTypeReqDescription
algorithmstringyesInferred from the value's own length. Not a parameter you send.
foundbooleanyesWe hold a build with this checksum. FALSE is a complete answer and a 200 — it says nothing about whether the file exists anywhere else.
hashstringyesThe hash as matched: lowercase hex, separators stripped.
matchobject|nullyesThe build, when found: packageName, appName, apkId (the id every per-build call takes), versionName, versionCode, arch, format, fileSize in bytes, sha256, isLatest and uploadedAt.
notestringyesWhat a miss does and does not prove for THIS algorithm. Only SHA-256 is carried by every stored build, so a SHA-1 or MD5 miss can mean we hold the file and never computed that digest for it.

No examples provided.

request_fetch ~183

Ask us to download an app from Google Play when list_versions came back empty. Costs 10 credits, even when we already have builds (`READY`) or Google Play doesn't list the app — so call list_versions first. Free only when a fetch for the app is already running (`FETCHING`). A fetch usually takes a few minutes. Poll get_fetch_status every 10–30 seconds — not this tool — and call list_versions once it says READY. Paid apps and apps Google Play will not deliver to us are refused with the reason. An app not in the catalogue yet is looked up on Google Play live, for up to 20 seconds; UPSTREAM_UNAVAILABLE / UPSTREAM_BUSY then is refunded and means Play did not answer in time, not that the app does not exist — retry after a few seconds.

NameTypeReqDescription
packageNamestringyesAndroid package id.
NameTypeReqDescription
errorstring–FAILED only: why, in words safe to show a person.
packageNamestringyesThe package this fetch is for.
statusstringyesREADY: we hold builds — list the versions. FETCHING: a job is queued or running; poll again in a few seconds. FAILED: the last job failed; see `error`.
terminalboolean–FAILED only, and present only when retrying cannot help: Google Play will not deliver this app to us. Absent means another fetch request may succeed.
updatedAtstring–Status read only: when the job last moved.

No examples provided.

request_variant ~624

Ask for an on-demand build of an app's newest release that the ordinary download does not carry: every language (`+all-langs`), the 32-bit ARM build (`armeabi-v7a`), both ARM ABIs in one bundle (`universal`), the newest build for an older Android version (`@sdkNN`), or exactly what one real device gets (`device:<slug>`). We must already hold the ordinary build — call list_versions first, and request_fetch if it is empty. Costs 10 credits, even when the variant is already built (`READY`); free only when a build of that variant is already running (`FETCHING`). A build usually takes a few minutes: poll get_variant_status, not this tool, then pass its `variantId` to get_download_url. Builds are temporary — see `expiresAt`.

NameTypeReqDescription
packageNamestringyesAndroid package id.
variantstringyesWhich build: `<arch>[+all-langs][@sdkNN|@vcN]` with arch one of arm64-v8a, armeabi-v7a, universal, or `device:<slug>[+all-langs]`. Plain `arm64-v8a` is the ordinary build and not a variant. `+all-lan…
NameTypeReqDescription
buildobject––
errorstring–FAILED only: why, in words safe to show a person.
packageNamestringyesThe package.
statusstringyesREADY: `build` is live — mint it. FETCHING: being built; poll again in 10–30 seconds. FAILED: the last build failed, see `error`; requesting again retries. NEEDS_FETCH (status only): nobody has asked…
variantstringyesThe variant asked about.

No examples provided.

search_apps ~229

Search the APK catalogue by name, publisher or package id. Start here when you have a phrase and need a package name. Returns 24 results a page out of at most 60 matches, so paging stops at page 3 — narrow the phrase rather than paging for more. `facets` counts the matches by type and category before filtering, so it tells you which filter would narrow a broad phrase. Searching an exact package id works as a lookup. A phrase nobody has searched before asks Google Play live and can take up to 20 seconds; UPSTREAM_UNAVAILABLE / UPSTREAM_BUSY there is refunded and means Play did not answer in time, not that nothing matches — retry the same phrase after a few seconds.

NameTypeReqDescription
categorystring–Category id from list_categories.
pageinteger–1-based page number, 1–3. Defaults to 1.
qstringyesSearch phrase, publisher, or exact package id.
sortstring–Result ordering. Defaults to relevance.
typestring–Restrict to games or apps.
NameTypeReqDescription
facetsobject–How the match pool divides before `type`/`category` were applied — which filter would narrow the phrase, and by how much.
itemsarrayyes–
matchedinteger–Matches before type/category filtering were applied.
pageintegeryes1-based page number of this result.
perPageinteger–Rows per page.
totalintegeryesTotal matching rows across all pages.
totalPagesinteger–Number of pages available.

No examples provided.

Install

How do I install the APKCube MCP server?

APKCube is a hosted endpoint at https://apkcube.com/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · apkcube.com

# add to Claude Code
claude mcp add --transport http com-apkcube-apkcube 'https://apkcube.com/api/mcp'
Common questions

What is the APKCube MCP server?

APKCube is an MCP server listed in the public MCP registry as com.apkcube/apkcube. Search Android apps, check APK signing and scans, and get verified APK download links. This page covers its hosted endpoint (https://apkcube.com/api/mcp).

Is the APKCube MCP server safe to use?

APKCube scores 79 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the APKCube MCP server expose?

APKCube exposes 36 tools: search_apps, get_app, check_availability, list_versions, get_download_url, and 31 more. Their descriptions and schemas cost roughly 6,838 tokens of context every time the server is loaded.

Does the APKCube MCP server require authentication?

Yes. APKCube asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the APKCube MCP server still maintained?

APKCube is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.