# Configure Apple App Tracking Transparency (ATT)

This feature requires the Janus SDK (iOS or Flutter) and Fides Cloud or Fides Enterprise.

Apple's [App Tracking Transparency](https://developer.apple.com/documentation/apptrackingtransparency) (ATT) framework requires iOS apps to request explicit user permission before tracking users across apps and websites. Fides integrates with ATT natively through the Janus SDK: when the user denies the system prompt, non-exempt notices are automatically pre-populated to opt-out and their toggles are locked in the privacy experience.

## How it works

When `enableATT` is set in the Janus SDK configuration:

1. The SDK requests the system ATT permission dialog before showing the privacy experience.
2. If the user **denies or restricts** tracking, all non-exempt privacy notices are automatically set to opt-out and locked — users cannot change them.
3. If the user **allows** tracking, the privacy experience behaves normally.

Notices marked as ATT-exempt remain interactive regardless of the ATT response. This is useful for essential or informational notices (e.g. a "Strictly Necessary" notice) that should always be surfaced to the user.

## Step 1: Configure ATT-exempt notices

By default, all notices are subject to ATT locking when the user denies permission. To mark a notice as ATT-exempt — so it remains interactive even when ATT is denied:

1. Navigate to **Consent > Privacy notices** and select the notice you want to mark as ATT-exempt.
2. In the **Privacy notice details** card, toggle **Exempt from App Tracking Transparency (ATT)** to on.
3. Click **Save**.

Exempt notices will remain interactive in the Janus SDK privacy experience even when the user denies ATT. All other notices will be locked to opt-out.

ℹ️ The ATT exempt toggle is disabled for notice-only notices because the ATT locking behavior does not apply to them.

## Step 2: Add NSUserTrackingUsageDescription (iOS)

The system ATT dialog requires a usage description string in your **app's** `Info.plist`. Apple will reject apps that call ATT without it.

Add the following key to your app's `Info.plist`:

```
<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads to you.</string>
```

Update the string to accurately reflect how your app uses tracking — Apple reviews this for accuracy.

⚠️ This key must be in the **host app's** Info.plist, not the SDK. The Janus SDK cannot add it for you. Omitting it will cause a crash at runtime when ATT is requested.

## Step 3: Enable ATT in the Janus SDK

Set `enableATT` (iOS) or `enableAtt` (Flutter) to `true` in your `JanusConfiguration`. The flag defaults to `false` — existing behavior is unchanged unless you explicitly opt in.

**iOS:**

```
let config = JanusConfiguration(
    apiHost: "https://privacy-plus.yourhost.com",
    propertyId: "FDS-A0B1C2",
    enableATT: true
)
```

**Flutter:**

```
final config = JanusConfiguration(
  apiHost: 'https://privacy-plus.yourhost.com',
  propertyId: 'FDS-A0B1C2',
  enableAtt: true,
);
```

ℹ️ `enableATT` requires iOS 14+. On iOS 13 and below the flag is accepted but has no effect. On Android, `enableAtt` is always a no-op — Android has no ATT equivalent.

## Runtime behavior

| ATT response | Non-exempt notices | ATT-exempt notices |
| --- | --- | --- |
| Authorized | Normal (user can toggle) | Normal (user can toggle) |
| Denied | Pre-set to opt-out, toggle locked | Normal (user can toggle) |
| Restricted | Pre-set to opt-out, toggle locked | Normal (user can toggle) |
| Not determined | Normal — ATT not yet requested | Normal |
