Query Parameter Passthrough
Instead of creating a link per entity, create one opt-in link and append query parameters per use. They reach your app on open and after a deferred install.
Setup
Create (or update) the link with passthrough enabled:
curl -X POST https://api.ulink.ly/sdk/links \
-H "x-api-key: $ULINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "dynamic",
"slug": "orders",
"iosFallbackUrl": "https://apps.apple.com/app/your-app/id0000000000",
"androidFallbackUrl": "https://play.google.com/store/apps/details?id=com.yourapp",
"fallbackUrl": "https://yourstore.com/orders",
"allowQueryPassthrough": true
}'
Use it
Append parameters in your emails — no API call per order:
https://x.ulink.ly/orders?orderId=123&coupon=SUMMER
Receive it in the app
The params arrive in the resolved link's parameters, on every path:
// Flutter
ulink.onLink.listen((data) {
final orderId = data.parameters?['orderId']; // "123"
});
// Android
ulink.onLink.collect { data ->
val orderId = data.parameters?.jsonObject?.get("orderId")?.jsonPrimitive?.content
}
// iOS
ulink.onLink.sink { data in
let orderId = data.parameters?["orderId"] as? String
}
Rules & limits
- Override: appended params override stored
parameterswith the same key, and always arrive as strings. - Opt-in: only links created with
allowQueryPassthrough: trueforward params; others ignore appended query strings. - Limits: keys
[A-Za-z0-9_-]{1,64}, ≤ 25 params, ≤ 1024 chars/value, ≤ 4 KB total; invalid params are dropped.debugis reserved.