AppsFlyer
Mobile attribution and marketing analytics platform. Zeotap sends audience membership updates via the Audiences Import API and server-to-server in-app events via the S2S Events API to AppsFlyer.
Prerequisites
- An AppsFlyer account with admin or team-member access
- An AppsFlyer API V2 token (for audience syncs) or a dev key (for S2S events)
- At least one app registered in your AppsFlyer dashboard
- For audience syncs: an existing audience with an import key, or permission to create one
Authentication
AppsFlyer uses API Key authentication with two credential types depending on the target.
API V2 Token (Audiences)
- In AppsFlyer, navigate to Security Center > API Tokens
- Generate or copy your API V2 Token
- Enter the token in Zeotap as the API V2 Token
Dev Key (S2S Events)
- In AppsFlyer, go to App Settings > Dev Key
- Copy the dev key shown on the page
- Enter the key in Zeotap as the Dev Key
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| Platform | Select | Yes | The mobile platform: Android or iOS |
| App ID | Text | Yes | Your AppsFlyer app identifier. For iOS apps, prefix with id (e.g., id123456789) |
Target Settings
| Field | Type | Required | Description |
|---|---|---|---|
| Target Type | Select | Yes | Type of data to send: Audiences (Import API) or S2S Events |
| Audience Import Key | Text | Yes (Audiences only) | The import key for the target audience. Found in AppsFlyer under Audiences > Import |
Supported Operations
Sync Modes
| Mode | Supported |
|---|---|
| Upsert | — |
| Insert | Yes |
| Update | — |
| Mirror | — |
S2S events are append-only. Each event is sent as a separate POST request to the AppsFlyer S2S API.
Audience Sync Modes
| Mode | Supported |
|---|---|
| Add | Yes |
| Remove | Yes |
| Mirror | Yes |
| Upsert | — |
Audience syncs use the AppsFlyer Audiences Import API V2 with add, remove, or both (for mirror mode) actions.
Features
- Field Mapping: Yes
- Schema Introspection: No
Required Mapping Fields
| Target Type | Required Fields |
|---|---|
| S2S Events | appsflyer_id, eventName |
| Audiences | device_id (or one of: gaid, idfa, idfv, cuid) |
Default Destination Fields
S2S Events: appsflyer_id, eventName, eventValue, eventCurrency, eventTime, customer_user_id, ip, custom_data
Audiences: device_id, gaid, idfa, idfv, cuid, emails, phone_e164
How It Works
Audiences
- Zeotap reads rows from your warehouse model or audience
- Rows are chunked into batches of up to 10,000 devices (AppsFlyer’s per-request limit)
- Each batch is POSTed to
https://hq1.appsflyer.com/api/audiences-import-api/v2/{action} - The
{action}path parameter is set toaddorremovebased on the sync mode - In mirror mode, added/changed rows are sent as
addand removed rows are sent asremove - The
device_idfield is automatically mapped to the platform-specific identifier (gaidfor Android,idfvfor iOS) if not explicitly provided
S2S Events
- Zeotap reads event rows from your warehouse model
- Each row is sent as an individual POST to
https://api2.appsflyer.com/inappevent/{app_id} - The
authenticationheader carries your dev key - Each payload includes the
af_events_apiflag to indicate server-to-server origin - The
eventValuefield is serialized to a JSON string if provided as structured data
Rate Limits
| API | Limit |
|---|---|
| Audiences Import API | 350 requests per minute, 10,000 devices per request |
| S2S Events API | 1,000 requests per second |
| S2S Event Payload | Maximum 1 KB per event |
Best Practices
- Use platform-specific IDs: Map
gaidfor Android andidfa/idfvfor iOS rather than a generic device ID for best match rates - Audience updates take 24 hours: AppsFlyer processes audience imports asynchronously. Changes are reflected in partner networks within 24 hours
- Keep S2S payloads small: The 1 KB payload limit means you should only include essential event properties
- Use mirror mode for audiences: Mirror mode ensures your AppsFlyer audience stays in sync with your warehouse by handling both adds and removes automatically
- Prefix iOS app IDs: Always prefix iOS app IDs with
id(e.g.,id123456789)
Troubleshooting
Authentication failed: invalid API token
Verify your API V2 token in Security Center > API Tokens in the AppsFlyer dashboard. Tokens generated before March 10, 2026, 19:00 UTC have been revoked and need to be regenerated.
Authentication failed: invalid dev key
Confirm the dev key in App Settings > Dev Key. Ensure you are using the dev key for the correct app.
400 Bad Request on audience import
Check that the import_key is correct and the audience exists in AppsFlyer. Also verify that your device identifiers match the platform: Android requires gaid, oaid, imei, or cuid; iOS requires idfv, idfa, or cuid.
Events not appearing in AppsFlyer
S2S events require a valid appsflyer_id. This is the unique AppsFlyer-generated device identifier, not your own user ID. Verify that the appsflyer_id format matches the expected pattern (13 digits, dash, 7 digits).
Rate limit exceeded (429)
The Audiences Import API allows 350 requests per minute. If you are syncing large audiences, Zeotap automatically chunks into 10,000-device batches. For very large audiences (millions of devices), consider scheduling syncs during off-peak hours.
Audience changes not reflected in partner networks
AppsFlyer processes audience imports asynchronously. It can take up to 24 hours for changes to propagate to connected partner networks. Check the audience status in the AppsFlyer Audiences dashboard.
Missing device identifiers
Each device in an audience import must include at least one valid identifier for the platform. For Android: gaid, oaid, imei, or cuid. For iOS: idfv, idfa, or cuid. Rows without a valid identifier will be rejected by the API.
S2S event payload too large
The S2S Events API enforces a 1 KB payload limit per event. If your events contain large eventValue or custom_data fields, reduce the number of properties or move large payloads to a separate data pipeline.