# Prerequisites

Three things every consumer app needs before calling `Octet.start(...)`:

1. A **license key**.
2. **Privacy declarations** in your app bundle (iOS `Info.plist`) or runtime permission grants (Android).
3. A **minimum platform version**.

---

## 1. License key

The SDK is gated by a per-developer license key. Request a free key at [sdk.octetproof.com/signup](https://sdk.octetproof.com/signup).

The key is a PASETO v4.public token shaped like `octet_live_v4.public....` (or `octet_test_...` against staging). Octet signs the key, and the SDK verifies the signature locally before any network call.

A license key is free for up to **1,000 signed proofs per month** and renews automatically, with no time limit. There is no per-license device cap; install on as many devices as you need.

---

## 2. Platform privacy declarations

### iOS: `Info.plist` keys

Add these to your app's `Info.plist`. Without them, the iOS runtime crashes on first launch with a privacy-sensitive-data error that names the missing key.

#### Required

```xml
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app uses your location to verify and prove your location
to services that request it.</string>

<key>NSMotionUsageDescription</key>
<string>This app uses motion data to detect when you're stationary or
moving, which improves the confidence of location proofs.</string>
```

`NSMotionUsageDescription` is required. The SDK touches `CMMotionActivityManager` immediately during `Octet.start(...)`, and Apple requires the usage description before any code accesses that API. Read-only access also counts.

The strings are user-facing. The copy above is a safe default. Rewrite in your product's voice if you prefer.

#### Required only if you enable background location

If your app needs proofs while backgrounded, also add:

```xml
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app uses background location to continue generating
location proofs while you're not actively using it.</string>

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>
```

Without these the SDK silently falls back to foreground-only operation when the app is backgrounded. The SDK itself does not crash. Proofs stop generating until the app returns to foreground.

### Android: runtime permissions

The SDK's `AndroidManifest.xml` already declares everything it needs (location, motion, foreground service, internet, wake-lock). Manifest-merge propagates these declarations into your app. You do **not** need to copy permission declarations into your own manifest.

You **do** still need to request the runtime permissions from the user:

| Permission | When to request | Notes |
|---|---|---|
| `ACCESS_FINE_LOCATION` | Before `Octet.start(...)`. | SDK refuses to start without it. |
| `ACTIVITY_RECOGNITION` | Before `Octet.start(...)`. | Android 10+ (API 29+). Motion-classification features degrade gracefully if denied. Request it for full proof confidence. |
| `ACCESS_BACKGROUND_LOCATION` | After `ACCESS_FINE_LOCATION` is granted, only if you need background proofs. | Android 10+ requires this as a separate prompt. |

---

## 3. Minimum platform versions

| Platform | Minimum | Toolchain |
|---|---|---|
| iOS | 16.0 | Xcode 15+, Swift 5.9+ |
| Android | API 30 (Android 11) | Android Studio Hedgehog (2023.1.1)+, JDK 17, Kotlin 2.1+ |

---

Next: the [iOS Quick Start](/docs/getting-started/ios-quickstart/) or [Android Quick Start](/docs/getting-started/android-quickstart/).
