Free dev tool
Universal Link Validator
Make sure your links open your app. Paste a domain to check iOS Universal Links and Android App Links, then get a clean pass/fail summary with fix steps you can hand to engineering.
How it works
What happens when someone taps your link
Neither platform looks at your domain at the moment of the tap. Both check it when the app is installed, remember the answer and use it when a link is tapped. That is why a broken file can go unnoticed for days, and why a fixed one does not help instantly.
iPhone and iPad
apple-app-site-associationAt install
Reads Associated Domains
iOS looks at the
applinks:entries in the app’s Associated Domains entitlement.At install
Fetches through Apple’s CDN
Apple’s CDN downloads the file from your domain and hands the device its cached copy.
On tap
Matches the link
iOS compares the tapped domain and path with the app IDs and paths or components in that file.
Result
Match: your app opens
No match or no file: Safari opens the page
Android
assetlinks.jsonAt install
Reads intent filters
Android finds the intent filters marked
autoVerifyfor your domain.At install
Fetches assetlinks.json
It requests the file from
/.well-known/on every declared host. A redirect counts as a failure.At install
Checks the signing certificate
The package name and SHA-256 fingerprint in the file must match the certificate that signed the installed app.
Result
Verified: your app opens
Not verified: the browser opens, or a chooser on older Android versions
Checks
What this tool checks
One run makes up to ten requests: both association files on your domain and on its www (or bare) twin, the copy on Apple’s CDN and Google’s Digital Asset Links API. This is what it looks at.
Both locations, both hosts
Looks for
apple-app-site-associationin/.well-known/and at the root, and forassetlinks.jsonin/.well-known/, on your domain and its www twin.HTTPS and a 200
Reports the HTTP status of every request, plus timeouts and connection errors that stop a file from loading.
Redirects
Follows redirects, shows where each request ended up and flags a final URL on another host or on plain HTTP.
HTML where JSON should be
Catches a login page, an error template or a bot challenge from Cloudflare, Akamai and similar services, and shows the Content-Type header that came back.
Valid JSON
Parses each file and quotes the parser error when it fails, so you know what to fix.
applinks and app IDs
Confirms
applinks.detailsexists and lists every app ID in it. Add your App ID under Advanced to check that yours is there. Signed (PKCS7) files are recognised, not decoded.Relation and package names
Checks that assetlinks.json is a JSON array with the
delegate_permission/common.handle_all_urlsrelation and lists its package names. Add your package under Advanced to match it.SHA-256 fingerprint
Paste your signing certificate fingerprint under Advanced and the validator looks for it in the file, with or without colons.
Apple’s copy, Google’s view
Reads the copy Apple’s CDN serves to iPhones and asks Google’s Digital Asset Links API what it finds for your site, so you can compare both with your server.
No file yet, or one that won’t parse?Generate it with the AASA and assetlinks.json generator
What it can’t see
The app side: the Associated Domains entitlement, intent filters, whether a given path matches your paths or components rules, and how a particular in-app browser behaves. Check those on a real device before a launch.
Troubleshooting
Why links still open the browser
Most cases come down to one of these eight. The validator shows the server-side ones; the rest only appear on a real phone.
- 01iOS + Android
The tap happens inside Instagram, Facebook or TikTok
Works from Notes or Messages, opens a web page from a bio link or an ad.
Fix
These apps open links in their own in-app browser, which often keeps the URL instead of handing it to iOS or Android. Test every channel on its own and make sure the link still lands somewhere useful when the app doesn’t open, such as the store page or your website.
Test on a deviceInstagram and TikTok deep links - 02iOS + Android
The association file redirects
The file opens fine in a browser, yet verification fails.
Fix
Apple and Android expect a direct 200 at the exact URL. Remove http to https, apex to www and locale redirects on
/.well-known/.Visible in the validatorUniversal links open Safari? - 03iOS + Android
Wrong Content-Type
The file loads, yet the platform ignores it.
Fix
Serve both files as
application/json. The AASA file has no extension, so many servers default toapplication/octet-streamortext/plain.Visible in the validatorUniversal links open Safari? - 04iOS
Apple’s CDN still has the old file
You fixed the file, but iPhones keep opening Safari.
Fix
Apple’s CDN serves a cached copy that lags behind your server; the validator shows both. While testing, add
?mode=developerto the entitlement and turn on Associated Domains Development in the device’s developer settings.Visible in the validatorComplete guide to universal links - 05Android
The Play App Signing key is missing
Your own builds open the app, Play Store installs open the browser.
Fix
With Play App Signing, Google signs the app people install. Add the SHA-256 from Play Console, App integrity, App signing key certificate. Keep the upload key too if you ship builds outside Play.
Visible in the validatorAndroid App Links not verified - 06iOS
The link points to the page’s own domain
Buttons on your website open more web pages instead of the app.
Fix
iOS keeps people in Safari when they tap a universal link to the domain they are already on. Put app links on a separate subdomain, or use a Smart App Banner on the site.
Test on a deviceComplete guide to universal links - 07iOS
The user once chose Safari
The link works on your phone but not on a colleague’s.
Fix
Tapping the domain in the top-right corner after the app opens tells iOS to prefer Safari for that domain. Long-press the link and choose to open it in the app to switch back.
Test on a deviceUniversal links open Safari? - 08iOS
The App ID doesn’t match the build
Works in the staging build, fails in the release build.
Fix
The entry must be your Team ID plus the exact bundle ID of the shipped app, for example
ABCDE12345.com.example.app. Enter it under Advanced and the validator checks it.Visible in the validatorComplete guide to universal links
Skip the plumbing
Make links that just work
An Appy link looks at every tap and sends it to the right place: the App Store on an iPhone, Google Play on Android, your website on a laptop. Add deep links on Pro and people who already have the app land straight in it.
- Free plan
- No credit card
- Unlimited clicks on every plan
- Links keep working if you cancel
On Enterprise, your app gets its own link domain, and Appy hosts apple-app-site-association and assetlinks.json on it for you. How the SDK works
Frequently asked questions
What is an apple-app-site-association (AASA) file?
A JSON file on your domain that tells iOS which apps may open which links. It lives at https://your-domain/.well-known/apple-app-site-association, has no .json extension and lists your app IDs (Team ID plus bundle ID) with the paths or components they handle.
Where do the association files have to live?
iOS reads /.well-known/apple-app-site-association and Android reads /.well-known/assetlinks.json, on every host you use in links. Both must load over HTTPS with a direct 200, no redirects and the application/json content type.
Why do universal links open Safari instead of my app?
Either verification failed (a missing, redirected or invalid file, or an app ID that does not match the build), or iOS chose Safari on purpose: the tap came from an in-app browser or from a page on the same domain, or the user once picked Safari. Run the validator first; if it passes, test those cases on a device.
Why do links in my marketing emails open the browser instead of the app?
Email tools wrap each link in a click-tracking URL on their own domain. iOS and Android decide on that first domain only, and a redirect after it can’t open an app. Switch the validator to Link from an email and paste a link from a test email: it follows the redirects, names the email tool and shows what the tracking domain needs.
How do I check my assetlinks.json?
Enter your domain above and open Advanced to add your package name and SHA-256 fingerprint. On a test phone, adb shell pm get-app-links com.example.app shows whether Android marked each domain as verified.
Why does Android say app links verification failed?
Most often the fingerprint in assetlinks.json belongs to your upload key, while Play Store installs are signed with Google’s app signing key. Redirects, a wrong content type and bot protection on /.well-known/ come next. After fixing the file, run adb shell pm verify-app-links --re-verify com.example.app.
How long does Apple take to pick up a changed AASA file?
There is no instant refresh. Devices get the file from Apple’s CDN, which serves a cached copy, so a fix on your server takes a while to arrive. The validator shows the CDN copy next to yours. During development, ?mode=developer on the entitlement lets a device fetch straight from your server.
Do universal links work inside Instagram, Facebook or TikTok?
Often not. These apps open links in their own in-app browser, and whether a tap reaches your app depends on the app and the placement. Test each channel, and make sure your website or store listing works as a destination on its own.
Does the validator check my app, entitlements or paths?
It reads what your server, Apple’s CDN and Google’s Digital Asset Links API return. For a link from an email it also checks whether the rules in the AASA file cover that link. The app side, meaning the Associated Domains entitlement and intent filters, needs a test on a real device.
What is the difference between deep links and universal links?
A deep link is any link that opens a specific screen in an app. Universal Links on iOS and App Links on Android are the verified kind: ordinary HTTPS URLs that open the app when it is installed and a web page when it is not.
Do I need an account, and can I share the result?
No account is needed and the validator is free. Every run gets its own URL that you can copy and send to your developer. Those result pages are kept out of search engines.
Keep reading
Guides for the next step
- Complete guide to universal linksSet up the AASA file, assetlinks.json and the app side, step by step.
- Universal links open Safari?A repeatable triage routine for links that open the browser instead of the app.
- Android App Links not verifiedThe adb checklist, Play App Signing and the fixes that make Android verify.
- Deep linking vs universal linksWhat each one does, and what happens when the app is not installed.
- Instagram and TikTok deep linksHow in-app browsers treat links, and how to route social traffic to installs.
- QR code generatorTurn a link into a branded QR code for print, packaging and slides.