1Create a session (server-side)
Same first move as every integration: your backend calls POST /v1/sessions with your odc_live_… key. For the embedded path, the field you care about in the response is the id — it is your SDK session handle.
Create the session at the moment your user taps “link my account” — not when they open your app. The worker-arrival timer starts as soon as the session is created: a device must call connect before workerArrivalTimeoutAt (default 2 minutes) or the session expires unused. Always set metadata.userId so the user-scoped reads and the refresh API work later.
The response also carries connectUrl — the hosted App Clip link your QR fallback uses. The embed itself needs only the id: hand it to the SDK and the realtime transport is resolved for you, server-side.
POST /v1/sessions
Idempotency-Key: 7c2e9a4b-1f6d-4e3a-8b5c-2d9f7a1e0c6b
{
"providerId": "aadvantage",
"metadata": { "userId": "user-123" }
}{
"id": "ses_8fQ2mL0xW3vT",
"status": "pending",
"providerId": "aadvantage",
"connectUrl": "https://connect.odynn.com/link/horizon-travel/ses_8fQ2mL0xW3vT",
"workerArrivalTimeoutAt": "2026-07-21T12:02:00.000Z",
"authTimeoutAt": "2026-07-21T12:05:00.000Z",
"returnUrl": null,
"metadata": { "userId": "user-123" },
"createdAt": "2026-07-21T12:00:00.000Z"
}Field-by-field detail on the create call lives in the White-label walkthrough's Create a session step — the idempotency and metadata guidance applies here unchanged. One exception: returnUrl only affects the Odynn-hosted connectUrl surface (relevant if you ship the QR fallback); in the embed, your own controller owns the completion UI.