Skip to content
Tolinku
Tolinku
Sign In Start Free
Marketing · · 6 min read

Verifying App Indexing: Tools and Techniques

By Tolinku Staff
|
Tolinku smart banners dashboard screenshot for marketing blog posts

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

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.

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.

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 (not text/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.

On a physical iOS device:

  1. Open Notes or Messages.
  2. Paste a deep link URL (e.g., https://www.yourapp.com/products/123).
  3. Long-press the link. If Universal Links are working, the context menu shows "Open in YourApp."
  4. 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

  1. Go to Search Console > Settings > Associations.
  2. Click "Associate" and select your Android app.
  3. Verify ownership through the Play Console.

URL Inspection

Use the URL Inspection tool to check individual pages:

  1. Enter a URL that should have app indexing.
  2. Look for "Mobile usability" and "App" sections.
  3. Verify that Google detects the <link rel="alternate"> tag or structured data.

Enhancement Reports

Check for app indexing-specific issues:

  1. Go to Enhancements in the left sidebar.
  2. Look for "SoftwareApplication" or other structured data types.
  3. Review any errors or warnings.

Performance Filtering

Filter the Performance report to see app-specific data:

  1. Go to Performance > Search Results.
  2. Click "Search Appearance" filter.
  3. 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.json returns 200 with correct Content-Type
  • assetlinks.json contains correct package name and SHA-256 fingerprint
  • Google's DAL API returns your app in the statements
  • adb shell pm get-app-links shows "verified" for your domain
  • Deep links open the app without disambiguation dialog (Android)
  • apple-app-site-association returns 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.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.