Droidwatch GitHub Action Integration
Automatically scan APKs in your CI/CD pipeline and fail builds when threat
thresholds are exceeded. The action is published on the
GitHub Marketplace
as Omar1123/droidwatch-scan@v1.
Full example workflow
Create .github/workflows/apk-security-scan.yml in your repository:
name: APK Security Scan
on:
push:
branches: [main, develop]
paths:
- '**.apk'
- 'app/build/**'
pull_request:
branches: [main]
workflow_dispatch:
inputs:
apk_path:
description: 'Path to APK file'
required: false
default: 'app/build/outputs/apk/release/app-release.apk'
jobs:
droidwatch-scan:
name: Droidwatch APK Analysis
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build APK
run: ./gradlew assembleRelease
- name: Droidwatch Security Scan
id: scan
uses: Omar1123/droidwatch-scan@v1
with:
apk_path: app/build/outputs/apk/release/app-release.apk
api_key: ${{ secrets.DROIDWATCH_API_KEY }}
fail_on_verdict: "Malicious|High Risk"
- name: Print scan summary
if: always()
run: |
echo "Verdict : ${{ steps.scan.outputs.verdict }}"
echo "Score : ${{ steps.scan.outputs.score }}"
echo "Report : ${{ steps.scan.outputs.report_url }}"
Inputs
| Input | Required | Default | Description |
|---|---|---|---|
apk_path |
Yes | — | Path to the artifact relative to the workspace root: .apk / .aab / .xapk / .dex / .ipa (iOS, static analysis) |
api_key |
Yes | — | API key with upload permissions (dw_...). Generate one in My Profile → API Keys |
server_url |
No | https://droidwatch.app |
Base URL of the Droidwatch API to call |
fail_on_verdict |
No | Malicious |
Pipe-separated verdicts that fail the build, e.g. Malicious\|High Risk\|Suspicious |
timeout_seconds |
No | 300 |
How long to wait for the analysis to complete before aborting |
Outputs
| Output | Description |
|---|---|
verdict |
Analysis verdict: Malicious, High Risk, Suspicious, or Benign |
score |
Numeric risk score (0–100) |
run_id |
Droidwatch run ID for the full report |
report_url |
Public share URL to the full interactive report |
How to get an API key
- Log in to droidwatch.app (or your instance)
- Go to My Profile → API Keys
- Click Generate new key
- Copy the key — it starts with
dw_and is shown only once
API keys are scoped to your account's plan limits and require a plan with API access. Enterprise keys have no daily upload limits.
How to configure secrets
Never put your API key in the workflow YAML file directly. Store it as a GitHub Actions encrypted secret:
- In your GitHub repository, go to Settings → Secrets and variables → Actions
- Click New repository secret
- Create
DROIDWATCH_API_KEYwith thedw_...key from My Profile → API Keys
For organisation-wide pipelines, use Organisation secrets so every repository can share the key without duplicating it.
fail_on_verdict reference
| Value | Fails when verdict is... |
|---|---|
Malicious |
Malicious only |
Malicious\|High Risk |
Malicious or High Risk |
Malicious\|High Risk\|Suspicious |
Anything but Benign |
For fintech compliance pipelines, Malicious|High Risk|Suspicious is
recommended. For general CI use, Malicious|High Risk balances security
with false-positive noise.
Data handling
The action uploads your build artifact to the configured Droidwatch server for analysis — the file leaves the GitHub Actions runner. Analysis runs in an isolated sandbox and retention follows your plan's policy. Submitted binaries are never shared, and files can be encrypted at rest with AES-256-GCM.
Pointing at another environment
server_url defaults to https://droidwatch.app. Change it only when
Droidwatch has provided the address of a different environment.