{"name":"OpenLinkInApp deep link compatibility reference","canonical":"https://www.openlinkinapp.com/deep-link-reference","methodology":"https://www.openlinkinapp.com/how-we-test","verified":"2026-07-27","scope":"Behavior produced by the shipping OpenLinkInApp URL builders. It is not a guarantee that every installed app, browser, operating-system version, or regional package will accept the hand-off.","platformBehavior":[{"heading":"Android — intents with a website fallback","body":"Links use intent:// with S.browser_fallback_url set. Most use domain-based app resolution so regional apps can handle their own links. YouTube and Flipkart specify their global Android packages; YouTube Music keeps domain-based resolution. If the browser blocks the handoff or the app is absent, a timed website fallback and an Open in Browser button provide recovery. In-app browser policies can still prevent native app opening."},{"heading":"iOS — three different paths depending on context","body":"Apple has no equivalent of intent://, and Universal Links are suppressed inside in-app webviews. So the behaviour branches: in real Safari a plain https URL opens the app via its Universal Link; inside an in-app webview with a known custom scheme, the scheme is used with a timed https fallback; inside an in-app webview with no known scheme, the link escapes to real Safari with x-safari-https:// (iOS 17+) and lets the destination take over from there."},{"heading":"Why custom schemes are a short list on purpose","body":"A custom scheme that is not registered on the device produces an 'invalid address' alert and a bounce to the browser — strictly worse than not trying. So a scheme is only used when it is known to be registered and can be built reliably from the URL. Five platforms qualify. Everything else takes the Safari-escape path, which degrades to simply loading the page."}],"entries":[{"platform":"YouTube","domains":"youtube.com, youtu.be","iosScheme":"vnd.youtube://<videoId>","selfBounces":false,"sample":"https://www.youtube.com/watch?v=dQw4w9WgXcQ","note":"youtube:// does NOT work — the iOS app registers vnd.youtube://. Shorts ids are ordinary video ids, so /shorts/ URLs open in-app through the same scheme.","slug":"youtube-deep-link-generator"},{"platform":"YouTube Music","domains":"music.youtube.com","iosScheme":null,"selfBounces":false,"sample":"https://music.youtube.com/watch?v=dQw4w9WgXcQ","note":"Deliberately excluded from the YouTube scheme: vnd.youtube:// would open the video in the main YouTube app instead of YouTube Music. No documented YT Music scheme exists, so these take the Safari-escape path where the Universal Link opens the right app."},{"platform":"Spotify","domains":"open.spotify.com","iosScheme":"spotify://<type>/<id>","selfBounces":false,"sample":"https://open.spotify.com/track/4cOdK2wGLETKBW3PvgPWqT","note":"Covers track, album, artist, playlist, show and episode — the content type is read straight out of the URL path, so all six work through one builder.","slug":"spotify-deep-link-generator"},{"platform":"Telegram","domains":"t.me, telegram.me","iosScheme":"tg://resolve?domain= or tg://join?invite=","selfBounces":false,"sample":"https://t.me/durov","note":"Two different schemes: public t.me/<name> maps to tg://resolve, private t.me/+<invite> maps to tg://join. Using resolve for an invite link silently fails.","slug":"telegram-deep-link-generator"},{"platform":"WhatsApp","domains":"wa.me, chat.whatsapp.com, api.whatsapp.com","iosScheme":"whatsapp://send?phone= or whatsapp://chat?code=","selfBounces":false,"sample":"https://wa.me/919999999999","note":"Chat links carry a phone number, group invites carry a code, and they use different schemes. This also skips WhatsApp's 'Continue to chat' interstitial, which is where a slice of leads is normally lost.","slug":"whatsapp-deep-link-generator"},{"platform":"Medium","domains":"medium.com","iosScheme":"medium://p/<postId>","selfBounces":false,"sample":"https://medium.com/@author/some-title-1a2b3c4d5e6f","note":"The post id is the trailing hex segment of the slug. Articles on custom publication domains have no id to extract, so those fall back to the Safari-escape path.","slug":"medium-deep-link-generator"},{"platform":"Instagram","domains":"instagram.com","iosScheme":null,"selfBounces":true,"sample":"https://www.instagram.com/p/Cabcdefghij/","note":"No custom scheme needed: instagram.com hands off from plain https to its own app even inside another app's webview. Forcing a scheme here would be strictly worse than doing nothing.","slug":"instagram-deep-link-generator"},{"platform":"X (Twitter)","domains":"x.com, twitter.com","iosScheme":null,"selfBounces":true,"sample":"https://x.com/jack/status/20","note":"Self-bouncing from https. Both the x.com and legacy twitter.com hosts behave the same way.","slug":"twitter-x-deep-link-generator"},{"platform":"TikTok","domains":"tiktok.com, vm.tiktok.com","iosScheme":null,"selfBounces":true,"sample":"https://www.tiktok.com/@user/video/7000000000000000000","note":"Self-bouncing from https, including the vm.tiktok.com short host.","slug":"tiktok-deep-link-generator"},{"platform":"Facebook","domains":"facebook.com, fb.watch","iosScheme":null,"selfBounces":true,"sample":"https://www.facebook.com/zuck","note":"Self-bouncing from https. Meta's own webviews are the most common origin for these links.","slug":"facebook-deep-link-generator"},{"platform":"LinkedIn","domains":"linkedin.com","iosScheme":null,"selfBounces":true,"sample":"https://www.linkedin.com/in/williamhgates","note":"Self-bouncing from https, for both /in/ profiles and /posts/ URLs.","slug":"linkedin-deep-link-generator"},{"platform":"Amazon","domains":"amazon.*, amzn.to, amzn.in, a.co","iosScheme":null,"selfBounces":false,"sample":"https://www.amazon.com/dp/B0ABCDEFGH","note":"No scheme and no pinned Android package, deliberately. Amazon ships per-region apps (com.amazon.Amazon, com.amazon.AmazonIN, in.amazon.mShop.android.shopping, …) so any pinned identifier is unresolvable in every other region. The published assetlinks.json lists all regional packages, so a package-less intent resolves correctly wherever the user is. Product URLs are also reduced to the bare /dp/<ASIN> form, because Amazon's AASA whitelists that shape and excludes various ref= patterns.","slug":"amazon-deep-link-generator"},{"platform":"Flipkart","domains":"flipkart.com, fkrt.cc, fkrt.it, dl.flipkart.com","iosScheme":null,"selfBounces":false,"sample":"https://www.flipkart.com/product/p/itmabcdef","note":"The one pinned Android package on the site (com.flipkart.android). Flipkart ships a single worldwide package, and the pin still opens the app on devices where App Links verification failed — which is the normal case for the fkrt.cc short hosts.","slug":"flipkart-deep-link-generator"},{"platform":"Reddit","domains":"reddit.com, redd.it","iosScheme":null,"selfBounces":false,"sample":"https://www.reddit.com/r/programming/","note":"Package-less intent on Android, Safari escape on iOS. No custom scheme is built.","slug":"reddit-deep-link-generator"},{"platform":"OnlyFans","domains":"onlyfans.com","iosScheme":null,"selfBounces":false,"sample":"https://onlyfans.com/username","note":"No native main-platform app. The link escapes an embedded webview to Safari on iOS and uses the original website as the Android intent fallback.","slug":"onlyfans-link-opener"},{"platform":"Pinterest","domains":"pinterest.com, pin.it","iosScheme":null,"selfBounces":false,"sample":"https://www.pinterest.com/pin/1234567890/","note":"Package-less intent on Android; Safari escape on iOS where Pinterest's Universal Link takes over.","slug":"pinterest-deep-link-generator"},{"platform":"Snapchat","domains":"snapchat.com","iosScheme":null,"selfBounces":false,"sample":"https://www.snapchat.com/add/username","note":"Snapchat is detected as an in-app webview when links arrive FROM it, but its own links take the ordinary intent / Safari-escape path.","slug":"snapchat-deep-link-generator"},{"platform":"Twitch","domains":"twitch.tv","iosScheme":null,"selfBounces":false,"sample":"https://www.twitch.tv/somechannel","note":"Package-less intent on Android; Safari escape on iOS. Channels, VODs and clips all behave identically.","slug":"twitch-deep-link-generator"},{"platform":"Discord","domains":"discord.gg, discord.com","iosScheme":null,"selfBounces":false,"sample":"https://discord.gg/someinvite","note":"Invite links resolve to the join screen once the app opens. Safari escape on iOS.","slug":"discord-deep-link-generator"},{"platform":"SoundCloud","domains":"soundcloud.com, on.soundcloud.com","iosScheme":null,"selfBounces":false,"sample":"https://soundcloud.com/artist/track","note":"Package-less intent on Android; Safari escape on iOS.","slug":"soundcloud-deep-link-generator"},{"platform":"Google Maps","domains":"google.com/maps, maps.app.goo.gl","iosScheme":null,"selfBounces":false,"sample":"https://maps.app.goo.gl/abcdef","note":"The Share button produces a maps.app.goo.gl short link, which the Maps app claims through App Links on Android.","slug":"google-maps-deep-link-generator"},{"platform":"Threads","domains":"threads.net, threads.com","iosScheme":null,"selfBounces":false,"sample":"https://www.threads.com/@username","note":"Not on the self-bouncing list despite being Meta's — it is newer than that list. On iOS it is still caught by the in-app-webview check, because iOS webviews embedded by other apps omit the Safari token from the user agent, so it takes the Safari-escape path.","slug":"threads-deep-link-generator"},{"platform":"Myntra","domains":"myntra.com","iosScheme":null,"selfBounces":false,"sample":"https://www.myntra.com/product/12345","note":"Package-less intent on Android; Safari escape on iOS.","slug":"myntra-deep-link-generator"},{"platform":"eBay","domains":"ebay.com and regional domains","iosScheme":null,"selfBounces":false,"sample":"https://www.ebay.com/itm/123456789","note":"Regional domains (ebay.co.uk, ebay.de, …) each verify their own host, so the package-less intent resolves correctly per region.","slug":"ebay-deep-link-generator"},{"platform":"Anything else","domains":"any https URL","iosScheme":null,"selfBounces":false,"sample":"https://example.com/some/page","note":"There is no allowlist. Any https URL gets a package-less Android intent with a browser fallback, and the Safari-escape path on iOS. If the destination has an app that verified its domain, it opens; if not, the browser does. That is the whole design."}]}