Documentation
Deeplinks
Deeplinks move a user from the shell into the exact page of your app with signed state. They are for browser navigation, not agent API calls.
Start With A Route Inventory
Before declaring deeplinks, list every navigable page in your app where a user lands with entity-specific or identity-specific state — an order ID, a document slug, a profile, a project ID. Then ask: could a conversation meaningfully navigate there? Only declare deeplinks for pages that answer yes.
A good deeplink inventory includes:
What A Deeplink Does
Duct chooses a route
view_order.Duct signs the state
Your receiver verifies it
Your app confirms handoff
Declare A Deeplink
export default defineDuctConfig({
Receiver Route
The generated receiver route verifies the token and redirects. Exact framework code varies, but the flow is the same.
import { redirect } from 'next/navigation';
Plain HTTP Receiver
If you are using Python, Ruby, Go, or another backend, implement the same server-side steps: verify signature, validate expiry, apply state, redirect, then POST the callback.
Do not trust client state
Treat deeplink state as untrusted until the signed token is verified. Never accept arbitrary browser query params as authorization to access private records.