Deep links
A deep link does two things at once: open the destination directly in a native app when it’s installed, fall back to the App Store or Play Store otherwise. Elido implements this on top of two existing features:
- Smart links for OS-based routing.
- Universal Links / App Links files served from your custom domain so iOS and Android trust the redirect to bypass the browser.
You don’t need a special “deep link” object — any short link with the
right rules and the right .well-known files is one.
Step 1 — OS-targeted rules
Add targeting_rules that pick the store URL by OS, leaving the
destination_url as a desktop fallback:
curl -X PATCH \
https://api.elido.app/v1/workspaces/1/links/42 \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"destination_url": "https://example.com/get-the-app",
"targeting_rules": [
{
"label": "iOS",
"match": { "os": ["ios"] },
"destination_url": "https://apps.apple.com/app/id1234567890"
},
{
"label": "Android",
"match": { "os": ["android"] },
"destination_url": "https://play.google.com/store/apps/details?id=com.example.app"
}
]
}'That alone gets you store fallback. To open the installed app directly without a browser hop, ship the OS association files.
Step 2 — Apple Universal Links
Host an apple-app-site-association JSON document at the root of your
custom domain. Elido serves it for you when you upload it via the
domains API:
curl -X PATCH \
https://api.elido.app/v1/workspaces/1/domains/42/app-links \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"apple_app_site_association": {
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": ["/*"]
}
]
}
}
}'The file then resolves at:
https://go.example.com/.well-known/apple-app-site-associationiOS fetches it on first install (and re-validates periodically) — once
verified, taps on https://go.example.com/... open your app instead
of Safari.
Step 3 — Android App Links
Same idea, with the Android assetlinks format:
curl -X PATCH \
https://api.elido.app/v1/workspaces/1/domains/42/app-links \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"android_assetlinks": [
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["AB:CD:EF:..."]
}
}
]
}'Served at:
https://go.example.com/.well-known/assetlinks.jsonAndroid picks this up on app install. Verify with adb shell pm get-app-links com.example.app.
Step 4 — Custom URL schemes (optional)
If your app registers a myapp:// scheme as well, you can route to
it directly via the Universal Link / App Link target — most native
SDKs (Branch, Adjust, AppsFlyer) accept either.
A common shape
{
"destination_url": "https://example.com/web-fallback",
"targeting_rules": [
{ "match": { "os": ["ios"] }, "destination_url": "https://apps.apple.com/app/id123" },
{ "match": { "os": ["android"] }, "destination_url": "https://play.google.com/store/apps/details?id=com.example.app" }
]
}- App installed → OS opens the app via Universal/App Links.
- App not installed → store URL via the smart-link rule.
- Desktop / other → web fallback via
destination_url.
Testing
- iOS:
xcrun simctl openurl booted https://go.example.com/Ab3xQin a simulator with your app installed. - Android:
adb shell am start -a android.intent.action.VIEW -d "https://go.example.com/Ab3xQ". - Desktop: open the link in Chrome — should land on the web fallback.