Short answer: App Link verification looks for one relation: delegate_permission/common.handle_all_urls. A statement with only a credential-sharing relation, a misspelt relation, or a relation string outside an array will not verify. Add the exact string to the relation array.
What is happening
handle_all_urls relation: the Digital Asset Links relation delegate_permission/common.handle_all_urls, which grants an Android app permission to open the site's URLs as verified App Links.
Each statement in assetlinks.json grants one or more relations to a target. Google's App Links example uses exactly this relation. If it is missing, the statement says something else about your app, but not that it may handle the site's links.
- Google's Statement List tester, or the Digital Asset Links API (
statements:listwithrelation=delegate_permission/common.handle_all_urls), returns no statement for your app. - The Digital Asset Links API returns no statements when you filter by this relation.
Why does this happen?
The file is often created for another feature first, such as sharing credentials between a website and an app, and App Links are added later without updating the relation. Typos in the long relation string are also common.
- Other relation only: a statement created for credential sharing.
- Typo:
handle_all_url,common.handle_all_URLsor a missingdelegate_permission/prefix. - String instead of array:
"relation": "delegate_permission/common.handle_all_urls"rather than an array.
Querying the Digital Asset Links API with the relation filter shows straight away whether Google reads the relation, so a typo shows up as a missing statement rather than a silent mismatch. Fixing the relation does not change anything else in the statement, so the package name and fingerprint can stay as they are.
How to confirm it
- Fetch the file:
curl -s https://example.com/.well-known/assetlinks.json. - Search for the exact string
delegate_permission/common.handle_all_urlsinside arelationarray. - Query Google's API with the relation filter:
https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls. Your app should be listed. - Test the live file with Google's Statement List tester, or run
adb shell pm get-app-links com.example.appafter re-verifying.
How to fix it
- Add
delegate_permission/common.handle_all_urlsto therelationarray of your app's statement. - Keep any other relations the statement needs in the same array.
- Make sure
relationis an array, even with one value. - Deploy, then re-run verification:
adb shell pm set-app-links --package com.example.app 0 alladb shell pm verify-app-links --re-verify com.example.appadb shell pm get-app-links com.example.app
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example",
"sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
Copy the relation from Google's documentation to avoid typos. For the overall layout, see assetlinks.json wrong structure, and for the full walkthrough the Android App Links setup guide.