> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tappify.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# API surface

> Every public symbol in the Tappify Swift SDK: signatures, parameters, and defaults.

The Tappify SDK's public API is deliberately small: one enum, four static/instance
functions total. This page is reference — for a walkthrough, see the
[quickstart](/sdk/quickstart).

<Note>
  This page documents the SDK's Swift API only. The network protocol the SDK speaks to
  Tappify's backend is an internal integration surface, not a public API, and isn't
  documented here.
</Note>

## `Tappify.start`

```swift theme={null}
public static func start(
    appKey: String,
    apiBaseURL: URL = URL(string: "https://api.tappify.ai/api/v1")!,
    dashboardURL: URL = URL(string: "https://app.tappify.ai")!
)
```

Boots the SDK. Call it once, as early as possible — typically in
`AppDelegate.application(_:didFinishLaunchingWithOptions:)`. Calling it more than once is a
no-op after the first call.

| Parameter      | Default                         | Description                                                                                                   |
| -------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `appKey`       | — (required)                    | Your app's publishable key, from the dashboard. Identifies the app; authorizes nothing on its own.            |
| `apiBaseURL`   | `https://api.tappify.ai/api/v1` | Override only if you're pointed at a non-default Tappify backend (e.g. a self-hosted or staging environment). |
| `dashboardURL` | `https://app.tappify.ai`        | Override alongside `apiBaseURL` in the same non-default-environment cases.                                    |

Until `start(appKey:)` has been called and a device has completed pairing, the SDK makes no
network calls, renders no UI, and captures nothing.

## `Tappify.handle(url:)`

```swift theme={null}
@discardableResult
public static func handle(url: URL) -> Bool
```

Manually routes a URL to the SDK's activation handling. Returns `true` if the URL was a
Tappify activation link (whether or not the activation ultimately succeeded), `false` for
any other URL.

`Tappify.start(appKey:)` installs a swizzle on your app/scene delegate that intercepts
activation links automatically, so most integrations never call this directly. Call it
yourself when:

* Your team avoids runtime method swizzling on principle — wire it into your own URL
  handling (`application(_:open:options:)` or `scene(_:openURLContexts:)`) instead.
* Your app delegate doesn't implement any of the optional URL-handling methods the swizzle
  needs to attach to, in which case calling this manually is the *only* way activation
  links reach the SDK.

It's safe to call unconditionally alongside the automatic swizzle — it no-ops on
non-Tappify URLs and de-dups repeat deliveries of the same link, so double-handling the same
URL is harmless.

See [Troubleshooting](/sdk/troubleshooting#activation-link-tap-does-nothing) for the
symptom this solves.

## Screen tagging

```swift theme={null}
public static func tagScreen(_ name: String)
```

Manually sets the screen identifier used for any comment threads created from this point
until the next screen change. Call it from anywhere — most commonly a UIKit
`viewDidAppear` override.

```swift theme={null}
public extension View {
    func tappifyScreen(_ name: String) -> some View
}
```

A SwiftUI modifier that calls `Tappify.tagScreen(_:)` on appear. Attach it to any view:

```swift theme={null}
struct SettingsView: View {
    var body: some View {
        VStack { /* ... */ }
            .tappifyScreen("Settings")
    }
}
```

See [Screen names](/sdk/screen-names) for why this matters and when you need it.
