Pick your platform. Drop in the SDK. We host the rest.
applinks:go.pathkit.dev to your iOS associated domains.<intent-filter> for https://go.pathkit.dev to your AndroidManifest.configure() + matchInstall() at launch.Link — a short URL like https://go.pathkit.dev/abc12345 that resolves to your app (with deferred match on install) or a web fallback.
App — your iOS bundle + Android package + brand metadata. Links belong to apps.
Resolve — when someone hits a link. We meter on this. Bots filtered server-side.
Match — first-launch lookup via IP fingerprint + clipboard. Returns the link payload the user clicked before installing.
Deep View — customizable landing page shown when the app isn't installed. Brand color, hero image, custom CSS.
npm install @path-kit/js
// browser, Node 18+ import { PathKit } from '@path-kit/js'; const pk = new PathKit({ apiKey: 'pk_live_...' }); // Create a deep link const { url } = await pk.createLink({ dest_ios: 'https://apps.apple.com/.../id123', dest_android: 'https://play.google.com/store/apps/details?id=...', dest_web: 'https://example.com/landing', og: { title: 'Pizza recipe', description: 'Joe shared a recipe' }, data: { recipe_id: 'r42' } }); // Share content (Branch Universal Object equivalent) const out = await pk.share({ title: 'Pizza recipe', canonical_url: 'https://example.com/recipe/42', data: { recipe_id: 'r42' } }); if (navigator.share) navigator.share(out.share);
npx expo install @path-kit/react-native expo-linking expo-clipboard expo-secure-store
import PathKit from '@path-kit/react-native'; await PathKit.configure({ apiKey: process.env.EXPO_PUBLIC_PATHKIT_KEY, appId: 'app_xxx' }); PathKit.onDeepLink(({ code, source, data }) => { router.push(`/recipe/${data.recipe_id}`); }); await PathKit.matchInstall(); // clipboard → IP fingerprint → done
// Package.swift .package(url: "https://github.com/path-kit/pathkit-ios", from: "0.1.1")
import PathKit PathKit.shared.configure(apiKey: "pk_live_app_...", appId: "app_...") PathKit.shared.onDeepLink { event in // route on event.code / event.data } Task { try await PathKit.shared.matchInstall() }
iOS Privacy Manifest ships with the SDK target — no setup needed for App Store submission.
// settings.gradle.kts — add JitPack alongside your other repos dependencyResolutionManagement { repositories { google(); mavenCentral() maven { url = uri("https://jitpack.io") } } } // app/build.gradle.kts implementation("com.github.path-kit:pathkit-android:v0.1.2")
PathKit.configure( context = applicationContext, apiKey = BuildConfig.PATHKIT_KEY, appId = "app_xxx" ) PathKit.onDeepLink { event -> /* route on event.code */ } lifecycleScope.launch { PathKit.matchInstall() }
curl -X POST https://pathkit.dev/v1/links \ -H "Authorization: Bearer pk_live_..." \ -d '{ "dest_ios": "...", "dest_android": "...", "dest_web": "...", "data": { "any": "json" }, "og": { "title": "...", "image": "..." }, "tags": ["campaign-fall25"], "expires_at": 1820000000000 }'
// SDK call on first launch — no body required when key is app-scoped curl -X POST https://pathkit.dev/v1/match \ -H "Authorization: Bearer pk_live_app_..." // → { "found": true, "source": "fingerprint", // "code": "...", "data": { ... } }
curl -X POST https://pathkit.dev/v1/events \ -H "Authorization: Bearer pk_live_..." \ -d '{ "name": "purchase", "props": { "value": 99 }, "user_id": "..." }'
Register endpoints in the dashboard or via API. Events delivered with HMAC-SHA256 signature in the X-PathKit-Signature header (Stripe format: t=<ts>,v1=<hex>).
curl -X POST https://pathkit.dev/v1/webhooks \ -H "Authorization: Bearer pk_live_..." \ -d '{ "url": "https://acme.com/hooks/pk", "events": ["link.*"] }'
In Xcode → Signing & Capabilities → Associated Domains, add:
applinks:go.pathkit.dev
Or in Expo's app.json:
"ios": { "associatedDomains": ["applinks:go.pathkit.dev"] }
That's it — PathKit hosts the AASA at https://go.pathkit.dev/.well-known/apple-app-site-association with your team id + bundle id included automatically.
In AndroidManifest.xml, on your launcher Activity:
<intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="go.pathkit.dev" /> </intent-filter>
Then add your SHA256 cert fingerprint to the app config in the PathKit dashboard. Verify via the diagnostic.
Want links.acme.com instead of go.pathkit.dev?
links.acme.comlinks.acme.com to edge.pathkit.dev