Skip to main content

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 parameters with the same key, and always arrive as strings.
  • Opt-in: only links created with allowQueryPassthrough: true forward 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. debug is reserved.