Setting up app indexing is only half the work. Verifying that it actually works is the other half. Verification failures are often silent: your app does not appear in search results, but there is no error message telling you why. The verification files might have a typo, the intent filters might not match, or the structured data might be malformed.
This guide covers every tool and technique for verifying app indexing on both Android and iOS. For the setup process, see Google App Indexing. For getting app content into search, see app content in search results.
Android Verification
Digital Asset Links Validator
Google provides an API to verify your assetlinks.json file:
# Verify your domain's Digital Asset Links
curl -s "https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://www.yourapp.com&relation=delegate_permission/common.handle_all_urls" | python3 -m json.tool
A successful response includes your app's package name and SHA-256 fingerprint:
{
"statements": [
{
"source": { "web": { "site": "https://www.yourapp.com" } },
"relation": "delegate_permission/common.handle_all_urls",
"target": {
"androidApp": {
"packageName": "com.yourapp.android",
"certificate": {
"sha256Fingerprint": "AA:BB:CC:..."
}
}
}
}
]
}
If the response has an empty statements array, your assetlinks.json is not being found or parsed correctly.
Common assetlinks.json Issues
| Issue | Symptom | Fix |
|---|---|---|
| File not found | Empty statements array | Check URL: https://yourapp.com/.well-known/assetlinks.json |
| Wrong Content-Type | Validation fails | Serve with Content-Type: application/json |
| Wrong SHA-256 | Verification fails | Use Play Console fingerprint (Setup > App signing) |
| Missing package name | Partial verification | Verify package_name matches your applicationId |
| HTTP instead of HTTPS | Not fetched | Must be served over HTTPS |
adb Verification Commands
On a connected Android device or emulator:
# Check App Links verification status
adb shell pm get-app-links com.yourapp.android
# Force re-verification
adb shell pm verify-app-links --re-verify com.yourapp.android
# Check verification state for a specific domain
adb shell pm get-app-links --user 0 com.yourapp.android
The output shows verification status per domain:
com.yourapp.android:
ID: your-app-id
Signatures: [AA:BB:CC:...]
Domains:
www.yourapp.com: verified
links.yourapp.com: verified
If a domain shows none or error instead of verified, the assetlinks.json file is not correctly configured for that domain.
Testing Deep Links via adb
Verify that your app handles specific URLs:
# Open a deep link
adb shell am start -a android.intent.action.VIEW \
-d "https://www.yourapp.com/products/123" \
com.yourapp.android
# Open a deep link without specifying the package (tests auto-verification)
adb shell am start -a android.intent.action.VIEW \
-d "https://www.yourapp.com/products/123"
If the second command opens your app without showing a disambiguation dialog (the "Open with" chooser), App Links verification is working correctly.
iOS Verification
apple-app-site-association Validation
Fetch and validate your AASA file:
# Fetch the AASA file
curl -s https://www.yourapp.com/.well-known/apple-app-site-association | python3 -m json.tool
# Check the response headers
curl -sI https://www.yourapp.com/.well-known/apple-app-site-association
Verify:
- HTTP 200 status code (not a redirect).
- Content-Type:
application/json(nottext/html). - File contains your Team ID and Bundle ID in the correct format.
- No redirect: Apple does not follow redirects when fetching AASA files (as of iOS 14+, Apple uses a CDN).
AASA File Format
{
"applinks": {
"apps": [],
"details": [
{
"appIDs": ["TEAMID.com.yourapp.ios"],
"components": [
{ "/": "/products/*" },
{ "/": "/articles/*" }
]
}
]
}
}
Common issues:
| Issue | Fix |
|---|---|
| Wrong Team ID | Check in Apple Developer Portal > Membership |
| Wrong Bundle ID | Check in Xcode > Target > General |
| Missing path patterns | Add components entries for each URL pattern |
| File served as HTML | Configure server to serve JSON Content-Type |
| Redirect instead of direct serve | Apple CDN does not follow redirects; serve directly |
Apple's CDN Check
Apple caches AASA files through their CDN. You can check what Apple has cached:
curl -s "https://app-site-association.cdn-apple.com/a/v1/www.yourapp.com" | python3 -m json.tool
If the cached version is outdated, you may need to wait up to 24 hours for the CDN to refresh. There is no way to force a cache invalidation.
Testing Universal Links on Device
On a physical iOS device:
- Open Notes or Messages.
- Paste a deep link URL (e.g.,
https://www.yourapp.com/products/123). - Long-press the link. If Universal Links are working, the context menu shows "Open in YourApp."
- Tap the link. If it opens the app directly (without going through Safari), Universal Links are verified.
If the link opens Safari instead, Universal Links verification has failed. Check:
- The AASA file is correct.
- Your app has the Associated Domains entitlement (
applinks:www.yourapp.com). - The user has not previously chosen "Open in Safari" for your domain (this overrides Universal Links).
Google Search Console Verification
Link Your App
- Go to Search Console > Settings > Associations.
- Click "Associate" and select your Android app.
- Verify ownership through the Play Console.
URL Inspection
Use the URL Inspection tool to check individual pages:
- Enter a URL that should have app indexing.
- Look for "Mobile usability" and "App" sections.
- Verify that Google detects the
<link rel="alternate">tag or structured data.
Enhancement Reports
Check for app indexing-specific issues:
- Go to Enhancements in the left sidebar.
- Look for "SoftwareApplication" or other structured data types.
- Review any errors or warnings.
Performance Filtering
Filter the Performance report to see app-specific data:
- Go to Performance > Search Results.
- Click "Search Appearance" filter.
- Select "App Install" or review clicks/impressions that include app results.
Automated Verification Script
Create a script that checks all verification endpoints:
async function verifyAppIndexing(domain, packageName, teamId, bundleId) {
const results = { android: {}, ios: {}, web: {} };
// 1. Check assetlinks.json
const assetlinks = await fetch(`https://${domain}/.well-known/assetlinks.json`);
results.android.assetlinksStatus = assetlinks.status;
if (assetlinks.ok) {
const data = await assetlinks.json();
const hasPackage = JSON.stringify(data).includes(packageName);
results.android.packageFound = hasPackage;
}
// 2. Check AASA
const aasa = await fetch(`https://${domain}/.well-known/apple-app-site-association`);
results.ios.aasaStatus = aasa.status;
if (aasa.ok) {
const data = await aasa.json();
const hasTeamBundle = JSON.stringify(data).includes(`${teamId}.${bundleId}`);
results.ios.appIdFound = hasTeamBundle;
}
// 3. Check Google's DAL API
const dalUrl = `https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://${domain}&relation=delegate_permission/common.handle_all_urls`;
const dal = await fetch(dalUrl);
const dalData = await dal.json();
results.android.dalVerified = dalData.statements?.length > 0;
// 4. Check Apple CDN
const appleCdn = await fetch(`https://app-site-association.cdn-apple.com/a/v1/${domain}`);
results.ios.appleCdnStatus = appleCdn.status;
return results;
}
Run this script after any configuration change and before each app release.
Verification Checklist
After setup, verify each item:
-
assetlinks.jsonreturns 200 with correct Content-Type -
assetlinks.jsoncontains correct package name and SHA-256 fingerprint - Google's DAL API returns your app in the statements
-
adb shell pm get-app-linksshows "verified" for your domain - Deep links open the app without disambiguation dialog (Android)
-
apple-app-site-associationreturns 200 with correct Content-Type - AASA contains correct Team ID and Bundle ID
- Apple CDN has your AASA file cached
- Universal Links open the app from Notes/Messages (iOS)
- Search Console shows your app as associated
- URL Inspection detects app link annotations
- Structured data passes the Rich Results Test
Tolinku Verification
Tolinku automatically generates and hosts both assetlinks.json and apple-app-site-association files based on your Appspace configuration. After configuring your app settings (package name, SHA-256 fingerprint, Team ID, Bundle ID), verify using the tools above that Tolinku is serving the correct files for your custom domain.
For the setup process, see Google App Indexing setup. For the broader strategy, see app indexing and SEO for mobile apps.
Get deep linking tips in your inbox
One email per week. No spam.