---
title: "Poll an apk-teardown job's status/result"
method: GET
path: "/apk-teardown/jobs/{job_id}"
tags: ["AppInsights"]
---

# Poll an apk-teardown job's status/result

`GET /apk-teardown/jobs/{job_id}`

## Request

- Base URL: `https://api.crawlora.net/api/v1`
- URL: `https://api.crawlora.net/api/v1/apk-teardown/jobs/{job_id}`
- Auth: API key in header `x-api-key`

Returns the current status (queued, processing, done, failed, or lost) of a submitted job, and its full result once done.

## Path parameters

- `job_id` string, required

## Headers

- `x-api-key` string, required

## Response `200`

OK

- ApkteardownJobStatusResponseDoc
  - `code` integer
  - `data` ApkteardownJobDoc
    - `error` string
    - `failure_reason` string
    - `file_name` string
    - `job_id` string
    - `result` ApkteardownResult
      - `analytics_identity` ApkteardownAnalyticsIdentity
        - `firebase_app_id` string
        - `firebase_database_url` string
        - `firebase_project_id` string
        - `gcm_sender_id` string
      - `bundle` ApkteardownBundleInfo
        - `base_entry` string
        - `format` 'apk' | 'xapk' | 'apks'
        - `splits` string[]
      - `dex` ApkteardownDexInfo
        - `dex_count` integer
        - `multidex` boolean
      - `endpoints` string[]
      - `expires_at` string
      - `file` ApkteardownFileInfo
        - `declared_name` string
        - `sha256` string
        - `size_bytes` integer
      - `growth_marketing` ApkteardownGrowthMarketingSignal
        - `has_mmp` boolean
        - `mmp_providers` string[]
      - `icon_provenance` ApkteardownIconProvenance
        - `checked` boolean
        - `error` string
        - `hamming_distance` integer
        - `likely` string: "same_icon" | "different_icon" | "inconclusive"
        - `local_icon_found` boolean
        - `play_icon_found` boolean
      - `job_id` string
      - `library_versions` ApkteardownLibraryVersionEntry[]
        - `group_artifact` string
        - `version` string
      - `license_manifest` ApkteardownLicenseManifestInfo
        - `entries` ApkteardownLicenseManifestEntry[]
          - `license` string
          - `name` string
          - `version` string
        - `found` boolean
        - `path` string
      - `localization_consistency` ApkteardownLocalizationConsistency
        - `declared_locales` string[]
        - `gaps` string[]
        - `regional_matches` object
      - `manifest` ApkteardownManifestInfo
        - `app_features` ApkteardownAppFeatures
          - `app_shortcuts` boolean: AppShortcuts is whether the app declares static app shortcuts (android.app.shortcuts meta-data) — reveals which key user flows the developer chose to surface outside the app itself (e.g. via long-press on the launcher icon).
          - `home_screen_widget` boolean: HomeScreenWidget is whether any <receiver> registers the APPWIDGET_UPDATE broadcast action (home-screen widget support).
        - `compile_sdk` integer
        - `custom_permissions` ApkteardownCustomPermissionDeclaration[]: CustomPermissions is every <permission android:name="..." android:protectionLevel="..."/> the app declares at the top level of its own manifest — a self-defined permission other apps must hold to interact with it. Commonly used across a single company's own app suite (e.g. a bank's companion apps all requesting a signature-level permission the main app defines) — a real integration surface the manifest already carries that nothing previously extracted.
          - `name` string
          - `protection_level` string
        - `debuggable` boolean: Debuggable is <application android:debuggable="true">. A production APK shipped debuggable is a well-known, unambiguous real issue — a composition fact, not a judgment call, so it stays within this product's non-goal boundary (see the package doc comment).
        - `deep_link_schemes` string[]: DeepLinkSchemes is every distinct android:scheme value found on a <data> element under any <intent-filter> — custom URL schemes the app registers to handle. A payment/social SDK often registers its own callback scheme (e.g. a Stripe or PayPal redirect scheme), so this is corroborating evidence for an SDKFinding, not just a standalone fact.
        - `exported_components_count` ApkteardownComponentCounts
          - `activities` integer
          - `providers` integer
          - `receivers` integer
          - `services` integer
        - `foreground_service_types` string[]: ForegroundServiceTypes is every distinct android:foregroundServiceType value declared across all <service> elements (Android 14+ requires declaring one, e.g. "location", "camera", "microphone", "dataSync", "mediaPlayback") — background-capability signal beyond permissions alone.
        - `min_sdk` integer
        - `network_security_config_declared` boolean: NetworkSecurityConfigDeclared is whether <application android:networkSecurityConfig> references a custom config at all (typically used for certificate pinning or trusting extra CAs) — the attribute's presence is the signal; this does not verify the referenced resource file actually decodes cleanly.
        - `package_name` string
        - `permissions` string[]
        - `platform_reach` ApkteardownPlatformReach
          - `android_auto` boolean
          - `android_tv` boolean
          - `automotive` boolean
          - `wearable` boolean
        - `queried_packages` string[]: QueriedPackages is every package name declared in a top-level <queries><package android:name="..."/></queries> block (Android 11+ package-visibility declarations) — reveals real integration partners the app declares intent to interact with (e.g. a specific bank or wallet app's package name).
        - `target_sdk` integer
        - `uses_cleartext_traffic` boolean
        - `uses_cleartext_traffic_declared` boolean: UsesCleartextTrafficDeclared/UsesCleartextTraffic report whether <application android:usesCleartextTraffic> was explicitly present and, if so, its value. Android's own effective default differs by targetSdkVersion when the attribute is absent — this reports only what the manifest explicitly declares, not a computed effective default.
        - `version_code` integer
        - `version_name` string
      - `monetization_model` 'transactional_ecommerce' | 'subscription_iap' | 'ad_supported' | 'hybrid' | 'unknown'
      - `native_libraries` ApkteardownNativeLibrariesInfo
        - `abis` string[]
        - `crypto_libraries` string[]: CryptoLibraries flags well-known native crypto library filenames (libssl.so, libcrypto.so, ...) found under lib/ — presence detection only, not a symbol/version scan. This is intentionally lightweight: a full native symbol table analysis (detecting packers, custom crypto implementations, obfuscated native code) is squarely MobSF's job via Tier 2, not something this package re-implements.
        - `notable` string[]
      - `obfuscation` ApkteardownObfuscationInfo
        - `proguard_or_r8_detected` boolean
      - `permission_risk` ApkteardownPermissionGroup[]
        - `category` 'location' | 'camera' | 'microphone' | 'contacts' | 'sms' | 'call_log' | 'storage' | 'calendar' | 'sensors' | 'phone' | 'financial_adjacent' | 'advertising_id' | 'install_packages' | 'other'
        - `permissions` string[]
      - `play_store` ApkteardownPlayStoreCrossCheck
        - `app_id` string
        - `checked` boolean
        - `data_safety` ApkteardownPlayStoreDataSafetySummary
          - `collected_data_types` string[]
          - `collects_data` boolean
          - `shared_data_types` string[]
          - `shares_data` boolean
        - `declared_permissions` string[]
        - `discrepancies` string[]: Discrepancies is one direction only: the binary shows a risky capability (a permission or SDK category) that Play's Data Safety disclosure doesn't mention. See ReverseDiscrepancies for the other direction.
        - `error` string
        - `found_on_play_store` boolean
        - `reverse_discrepancies` string[]: ReverseDiscrepancies is the mirror of Discrepancies: Play's Data Safety disclosure claims a collected/shared data type with no corresponding permission or SDK evidence found in the binary. Not a claim that the developer over-disclosed — a disclosure can legitimately be broader than what a single build shows (a server-side collection path, a different build variant, or a data type collected outside this binary entirely).
      - `scanned_at` string
      - `sdks` ApkteardownSDKFinding[]
        - `category` 'payment' | 'analytics' | 'advertising' | 'crash_reporting' | 'push_notification' | 'social_auth' | 'other'
        - `confidence` 'high' | 'medium'
        - `evidence` string[]
        - `name` string
        - `source` string: Source records which tier produced this finding ("tier1_signature" or "tier2_mobsf"), so a caller (and this package's own tests) can tell where a given result came from when both tiers ran.
        - `version` string: Version is a best-effort SDK version, populated only when a matching META-INF/<group>_<artifact>.version file was found for an SDK whose known Maven group prefix is recorded in this package's own seed list (see packageSignature.mavenGroupPrefix) — most SDKFindings will have no version (empty string), and this is never inferred from package names alone.
      - `security_hygiene` ApkteardownSecurityHygiene
        - `factors` string[]
        - `score` integer
      - `signing` ApkteardownSigningInfo
        - `certificate` ApkteardownCertificateDetails
          - `issuer` string
          - `not_after` string
          - `not_before` string
          - `subject` string
        - `certificate_sha256` string
        - `schemes` string[]
        - `self_signed` boolean
        - `signed` boolean
        - `split_consistency` ApkteardownSplitSigningConsistency
          - `consistent` boolean
          - `mismatches` string[]
          - `notes` string[]
          - `splits_checked` integer
      - `size_breakdown` ApkteardownSizeBreakdown
        - `assets_bytes` integer
        - `dex_bytes` integer
        - `native_lib_bytes` integer
        - `other_bytes` integer
        - `resources_bytes` integer
      - `supported_locales` string[]: SupportedLocales is every locale this package could identify from res/values-<locale>/ resource-qualifier directory names (merged across bundle splits when applicable — see DetectSupportedLocales) — which languages/markets the app actually ships for.
      - `tech_stack` ApkteardownTechStackInfo
        - `confidence` 'high' | 'medium'
        - `evidence` string[]
        - `primary` 'flutter' | 'react_native' | 'cordova_ionic' | 'xamarin' | 'unity' | 'native_kotlin_java'
        - `ui_toolkit` string: UIToolkit refines the native_kotlin_java case: "jetpack_compose" when androidx.compose classes are present, empty otherwise. Deliberately never set to a "legacy_views" positive claim — absence of Compose doesn't prove classic Views (could be no UI, a library, etc.), so this only ever asserts a detected positive, matching how every other detector in this package treats absence as "not determined" rather than a claimed negative.
      - `tier2_note` string
      - `tiers_run` string[]
    - `status` string
    - `submitted_at` string
    - `updated_at` string
    - `webhook_delivered` boolean
    - `webhook_error` string
  - `msg` string

## Other responses

- `400`: job_id is required
- `404`: Job not found or expired
- `500`: Internal error reading the job

---

[API](https://skmtc.dev/crawlora/apis/crawlora-api.md) · [All operations](https://skmtc.dev/crawlora/apis/crawlora-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crawlora/apis/crawlora-api/revisions/028417aa35bb?raw)
