assetlinks.json is missing handle_all_urls

App Links only verify when assetlinks.json grants delegate_permission/common.handle_all_urls. Why other relations fail and how to fix the relation array.

SymptomThe assetlinks.json statement has the right package and fingerprint but App Links still do not verify.
Likely causeThe relation array does not include delegate_permission/common.handle_all_urls, which is the relation App Links check for.
FixAdd delegate_permission/common.handle_all_urls to the relation array of the statement for your app.

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:list with relation=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_URLs or a missing delegate_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

  1. Fetch the file: curl -s https://example.com/.well-known/assetlinks.json.
  2. Search for the exact string delegate_permission/common.handle_all_urls inside a relation array.
  3. 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.
  4. Test the live file with Google's Statement List tester, or run adb shell pm get-app-links com.example.app after re-verifying.

How to fix it

  1. Add delegate_permission/common.handle_all_urls to the relation array of your app's statement.
  2. Keep any other relations the statement needs in the same array.
  3. Make sure relation is an array, even with one value.
  4. Deploy, then re-run verification:
  • adb shell pm set-app-links --package com.example.app 0 all
  • adb shell pm verify-app-links --re-verify com.example.app
  • adb 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.

FAQ

Common questions

Which relation do App Links need?

`delegate_permission/common.handle_all_urls`. It is the relation in Google's App Links example and the one the Digital Asset Links API filter uses for App Link checks.

Can one statement carry several relations?

Yes. The `relation` field is an array, so you can list App Links alongside other relations for the same app.

Is the relation string case-sensitive?

Treat it as exact. Copy it from Google's documentation rather than typing it, since small differences mean the relation is not recognised.

How can I see which relations Google reads from my file?

Call the `statements:list` endpoint of the Digital Asset Links API with your site. Without the relation filter it returns every statement it can read; with it, only the matching ones.

What are UTM parameters?

UTM parameters are tags added to the end of a link, such as utm_source and utm_campaign, that tell analytics tools where a visit came from. They let you see which campaign, channel and ad brought each visitor.

Which UTM parameters are required?

Use utm_source, utm_medium and utm_campaign on every campaign link. utm_term and utm_content are optional and help you compare keywords or ad variants.