DOCS · QUICKSTART · API REFERENCE

Ship deep links in 10 minutes.

Pick your platform. Drop in the SDK. We host the rest.

Quickstart

  1. Sign up (14-day Pro trial, card on file)
  2. Create an app in the dashboard. Set your iOS bundle id + Android package + SHA256 fingerprint.
  3. Add applinks:go.pathkit.dev to your iOS associated domains.
  4. Add an App Links <intent-filter> for https://go.pathkit.dev to your AndroidManifest.
  5. Install the SDK for your platform. Call configure() + matchInstall() at launch.
  6. Run the diagnostic to confirm. Done.

Concepts

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.

@path-kit/js — Web + Node

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);

@path-kit/react-native — Expo / RN

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

pathkit-ios — Swift Package

// 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.

pathkit-android — Kotlin

// 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() }

POST /v1/match

// 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": { ... } }

POST /v1/share

curl -X POST https://pathkit.dev/v1/share \
  -H "Authorization: Bearer pk_live_app_..." \
  -d '{ "title": "Pizza recipe", "canonical_url": "...", "data": { "recipe_id": "r42" } }'
// → { "url": "https://go.pathkit.dev/...", "share": { title, text, url }, ... }

POST /v1/events

curl -X POST https://pathkit.dev/v1/events \
  -H "Authorization: Bearer pk_live_..." \
  -d '{ "name": "purchase", "props": { "value": 99 }, "user_id": "..." }'

Outbound webhooks

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.*"] }'

Universal Links setup (iOS)

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.

App Links setup (Android)

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.

Custom link domain (Pro+)

Want links.acme.com instead of go.pathkit.dev?

  1. Dashboard → Settings → Custom Domain → add links.acme.com
  2. Verify ownership via DNS TXT record (we generate the token)
  3. Point a CNAME from links.acme.com to edge.pathkit.dev
  4. HTTPS auto-provisions in a few minutes