Deep linking · Guide
Digital Asset Links File: Hosting and Fields
assetlinks.json is the file that proves to Android that your website trusts your app. Serve it at /.well-known/assetlinks.json on every host, over https, as application/json, with no redirect, and list the SHA-256 fingerprint of every certificate that signs the builds people install.
In short
- One file per host: www, the bare domain and each subdomain each need their own.
- List the fingerprint of the key that actually signs releases. With Play App Signing that is Google's key, not only your upload key.
- Write fingerprints in upper case.
- Dynamic rules in relation_extensions work on Android 15 and later with Google services; malformed rules are discarded.
The fields, one by one
The file is a JSON array of statements. A minimal statement for one app looks like this; the fingerprint below is a placeholder in the right format:
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.sportsbook",
"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"
]
}
}
]
- relation:
delegate_permission/common.handle_all_urlsis the relation App Links verification looks for. - target.namespace:
android_appfor an app. - package_name: the application ID in your build, such as
com.example.sportsbook. - sha256_cert_fingerprints: an array, so it can hold several fingerprints, for example the Play signing key and a key used for another release channel.
If one host serves several apps, for example a casino app and a sportsbook app under the same brand, add one statement per app to the same array.
Hosting rules
| Requirement | What it means in practice |
|---|---|
| Path | https://domain.name/.well-known/assetlinks.json on each host |
| Content type | application/json |
| Protocol | Reachable over https, even if the intent filters also list http |
| Redirects | None. No 301 or 302 on the file, including bare domain to www |
| Hosts | One file per host domain |
Two server habits break this on gambling sites more than anywhere else. Geo-blocking rules that answer some requests with a redirect or a block page can catch the verifier, and a content delivery network rule that forces the bare domain to www redirects the file. Exempt /.well-known/ from both. The troubleshooting guide adds one more check: example.com., with a trailing period, should serve the same content as example.com.
Which fingerprints to list
The fingerprint must match the certificate that signed the build on the device. The troubleshooting guide puts it plainly: "If you are using Play App Signing, make sure you're using the signature that Google uses to sign each of your releases." Your upload key is not enough when Google re-signs the app. The same guide lists two quieter faults: a lower-case fingerprint, since "The signature should be in upper case," and a debug-signed build tested against a file that only holds the release fingerprint.
Copy fingerprints from the Play Console or your keystore rather than retyping them, then paste the whole file into the association file linter to catch format slips.
Dynamic rules on Android 15 and later
Android 15 added an optional relation_extensions block that narrows which paths open the app without shipping a new build. It works on Android 15 (API level 35) or later on devices with Google services; Android 14 and earlier ignore it. Place it inside each statement object, next to relation and target.
"relation_extensions": {
"delegate_permission/common.handle_all_urls": {
"dynamic_app_link_components": [
{"/": "/help/*", "exclude": true},
{"/": "/events/*"},
{"/": "/bet/*", "?": {"market": "*"}}
]
}
}
- Matcher keys are
/for the path,#for the fragment and?for a dictionary of query parameters;excludeset to true keeps matching links out of the app. - Wildcards:
*matches zero or more characters,?exactly one,?*one or more. - Rules run in order and the first match wins. A link that matches no rule does not open the app, so put exclusions first.
- Rules can only cover hosts already declared in the manifest. They cannot widen it.
- Declare one
dynamic_app_link_componentsobject per site, relation and app statement. If any field is malformed or empty, Android discards the dynamic rules and falls back to the manifest.
For a sportsbook, this lets you keep a safer gambling or help path on the web while the rest of the site opens in the app, and change that list between releases. The manifest side of the same setup is in the Android App Links setup guide.
How long changes take
Android 15 and later re-check the file in the background: "Changes can take up to seven days to propagate to all end-user devices due to the system's caching and scheduled re-verification." On Android 14 and lower, "The system does not perform periodic background re-verification," so a device's stored result does not refresh on a schedule. Plan file changes ahead of a campaign, and use the Digital Asset Links API to see what Google reads: Record each host as done in the deep link implementation checklist.
https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://www.example.com&relation=delegate_permission/common.handle_all_urls
How these timings compare with Apple's content delivery network is set out in the comparison of the two association files.
Questions
Can one assetlinks.json file cover several subdomains?
No. Android's documentation says each host domain needs its own file, so www.example.com and help.example.com each serve /.well-known/assetlinks.json.
Should development builds share the production file?
Keep test hosts out of release manifests. The troubleshooting guide notes that non-verifiable links added for testing make Android 11 and lower skip verification of all App Links, and it lists a debug-signed build checked against a file that holds only the release signature as a common failure.
What happens if one dynamic rule is malformed?
Android discards the dynamic rules and falls back to the static rules in the manifest. Check the file with the association file linter before you deploy it.
Sources
- Android Developers, Configure website associations and dynamic rules, last updated October 23, 2026.
- Android Developers, Troubleshoot App Links, last updated October 23, 2026.
- Android Developers, Verify App Links, last updated October 23, 2026.
- Android Developers, Test App Links, last updated October 16, 2026.
- Google Developers, Digital Asset Links, linked from Android's Configure page; not fetched by us.
How we choose and date sources: data sources.