Security

    Android App Links verification with assetlinks.json

    A 2026 view of an Android App Link verified by a Digital Asset Links assetlinks.json file, opening directly in the app while an unverified deep link falls back to a chooser

    On Android, the difference between a link any app can claim and a link that belongs to you comes down to verification. Android App Links are HTTPS deep links that you prove are yours by hosting a Digital Asset Links file on your domain, so the system opens them directly in your app and no other app can hijack them. Without that verification, a deep link is just a request any installed app can register to handle, which is a link-hijacking risk. Here is how App Links and the assetlinks.json verification work, and why they are the secure way to handle deep links.

    Short answer

    Android App Links are HTTPS links verified to belong to your app through a Digital Asset Links file, assetlinks.json, hosted at /.well-known/ on your domain. Per Android's App Links documentation, when you mark an intent filter with android:autoVerify="true" and host a valid assetlinks.json listing your app's package name and signing certificate fingerprint, the system verifies the link is yours and opens it directly in your app, with no chooser dialog and no way for another app to claim it. This is the secure alternative to custom schemes and unverified deep links, which any app can register to intercept. Set up verification correctly so your links cannot be hijacked.

    What you should know

    • App Links are verified HTTPS links: proven to belong to your domain.
    • assetlinks.json is the proof: hosted at /.well-known/ on your domain.
    • autoVerify triggers it: the intent filter requests verification.
    • Verified links cannot be hijacked: other apps cannot claim them.
    • Unverified deep links can be claimed: any app can register to handle them.

    They are deep links the system has confirmed belong to your app. An App Link is an HTTPS URL on your own domain that opens directly in your app because Android verified the association between the domain and the app. The verification uses Digital Asset Links: you host an assetlinks.json file at the well-known path on your domain that names your app's package and its signing certificate fingerprint, and you mark the matching intent filter with android:autoVerify="true". When those line up, Android trusts that the link is yours, opens it in your app without showing a chooser, and prevents another app from handling it. So App Links are the verified, hijack-resistant form of deep linking, the Android counterpart to iOS Universal Links, and they exist precisely because unverified links are not trustworthy.

    The difference is whether the link is proven to be yours. The table compares them.

    Link typeHijack risk
    Verified App Link (autoVerify plus assetlinks.json)Low; the system confirms it is yours
    Unverified HTTPS deep linkHigher; another app can register to handle it
    Custom scheme like myapp://High; any app can register the scheme

    The verified App Link is the safe choice, because the Digital Asset Links check ties the link to your domain and signing key, so another app cannot claim it. An unverified deep link, by contrast, can prompt a chooser or be handled by another app that registered the same pattern, and a custom scheme is the least safe of all, since any app can declare it. For any link that carries meaning, verification is what makes it dependable.

    How do you set up verification?

    Host the assetlinks.json file and mark your intent filter for auto-verification. First, create an assetlinks.json that lists your app's package name and the SHA-256 fingerprint of your signing certificate, and serve it over HTTPS at /.well-known/assetlinks.json on the domain your links use. Second, add an intent filter for your HTTPS links with android:autoVerify="true", so Android attempts verification on install. When the file and the manifest agree, the links become verified App Links that open directly in your app. The common failure is a verification mismatch, a missing or unreachable file, the wrong certificate fingerprint, or a domain mismatch, which causes verification to fail silently and your links to fall back to the chooser, where they can be claimed by other apps. So confirm the file is correct and reachable, and test that verification actually succeeds.

    What to watch out for

    The first trap is relying on a custom scheme or an unverified deep link for something that matters, when either can be intercepted; use a verified App Link. The second is a broken assetlinks.json, wrong fingerprint, wrong path, or not reachable, which makes verification fail quietly and drops you back to a hijackable chooser. The third is treating an incoming link as trusted; even with App Links, validate the input rather than acting on it blindly. A pre-submission scan such as PTKD.com (https://ptkd.com) reads the compiled APK or AAB against OWASP MASVS and surfaces your deep-link intent filters and how the app handles links, so you can confirm sensitive links use verified App Links rather than an unverified pattern. The hosting and manifest setup you complete on your side.

    What to take away

    • Android App Links are HTTPS links verified to belong to your app via a Digital Asset Links file, so the system opens them directly and no other app can hijack them.
    • Verification needs android:autoVerify="true" on the intent filter and a valid assetlinks.json with your package name and signing fingerprint at /.well-known/ on your domain.
    • They are the secure alternative to custom schemes and unverified deep links, which any app can register to intercept.
    • Confirm the assetlinks.json is correct and reachable so verification succeeds, and use a pre-submission scan such as PTKD.com to check your deep-link handling.
    • #android
    • #app-links
    • #assetlinks
    • #deep-links
    • #digital-asset-links
    • #owasp-masvs
    • #app-security

    Frequently asked questions

    What are Android App Links?
    They are HTTPS deep links the system has verified belong to your app. An App Link is a URL on your own domain that opens directly in your app because Android confirmed the association using Digital Asset Links: an assetlinks.json file on your domain names your app's package and signing certificate fingerprint, and the matching intent filter is marked autoVerify. When they agree, Android opens the link in your app without a chooser and prevents another app from handling it. They are the Android counterpart to iOS Universal Links.
    How is an App Link different from a custom scheme?
    An App Link is verified to belong to your domain, so it cannot be hijacked, while a custom scheme like myapp:// can be registered by any app, making it the least safe option. An unverified HTTPS deep link sits in between: another app can register to handle the same pattern, and the system may show a chooser. For any link that carries meaning, use a verified App Link, since the Digital Asset Links check ties it to your domain and signing key.
    How do I set up App Link verification?
    Host an assetlinks.json file over HTTPS at /.well-known/assetlinks.json on your link's domain, listing your app's package name and the SHA-256 fingerprint of your signing certificate, and add an intent filter for your HTTPS links with android:autoVerify true so Android verifies on install. When the file and manifest agree, the links become verified App Links that open directly in your app. Then test that verification actually succeeds rather than assuming it did.
    Why is my App Link verification failing?
    Usually a mismatch in the Digital Asset Links setup: a missing or unreachable assetlinks.json, the wrong signing certificate fingerprint, a path that is not exactly /.well-known/assetlinks.json, or a domain mismatch. Verification fails silently, and your links fall back to the chooser, where another app can be selected to handle them, which is a hijack risk. Confirm the file is correct, served over HTTPS, and reachable, and that the fingerprint matches your release signing key.
    How do I confirm my app uses verified links?
    Scan the build. A pre-submission scan such as PTKD.com reads the compiled APK or AAB against OWASP MASVS and surfaces your deep-link intent filters and how the app handles links, so you can confirm sensitive links use verified App Links rather than an unverified pattern or a custom scheme. If it shows an unverified or scheme-based link for something sensitive, the fix is to move it to a verified App Link and validate the incoming data.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free