Use the /app endpoint to create new apps, update existing apps, and retrieve app information. This is the primary endpoint for automating app management at scale.
The retrieve operations—get app by token, get app by store ID, and list all apps—return only apps that were created or updated via this API. To work with any app in your account (including those created in the dashboard), use the App Settings endpoint.
Create or update app via template
Create or update an app for Android, iOS, or both using settings from a template app.
How it works
- The API looks for an existing app using the requested platforms and their default store IDs.
- It creates an app if none exists, or adds missing platforms to the existing app.
- If you provide
stores, additional Android stores are added or updated. - A background job is queued to copy settings from your template app when migration is needed.
- The response includes a
ticket_tokento track the operation.
A background job is triggered when any of the following conditions are met:
- The app or a requested platform is newly created or first imported into App Automation
channel_setup,override_settings,editors, orios_pv_shared_secretfields are updatedforce_updateis set totrue- The previous migration failed
Changing stores alone doesn’t trigger a background migration for an app already managed through the API. Other settings changes and force_update still determine whether a migration is needed. Store changes are applied before any migration job starts. To also copy updated template settings, set force_update to true.
API protocol
Endpoint: https://automate.adjust.com/app-automation/app
Method: POST
Request body: Create/Update App Payload
Response: App Migration Response
Parameters
| Parameter | Data type | Required | Description |
|---|---|---|---|
name | String | Yes | Display name of the app. |
platforms | Object | Yes | android, ios, or both, each containing platform settings. |
default_platform | String | No | Default platform for a new app. Defaults to android when included in platforms, otherwise ios. Must be included in platforms. Existing apps keep their default platform. |
template_app_token | String | No | App token to copy settings from. Defaults to the template configured for your account. |
sections | Array[String] | No | App sections to migrate. If omitted or empty, all sections are migrated. |
force_update | Boolean | No | Set to true to copy updated template settings even if the app hasn’t changed. Default: false. |
override_settings | Object | No | Settings to override for the app. Applies to all requested platforms. |
currency | String | No | Currency code, such as EUR or GBP. Defaults to the template’s currency. Can only be set when creating the app. |
editors | Array[String] | No | Email addresses of custom users who need app access. Admins, editors, and readers already have access. |
ios_pv_shared_secret | String | No | iOS Purchase Verification shared secret. |
verification | Boolean | No | Verify the iOS app when verification is enabled for your account. Default: false. |
Platforms
Each entry in platforms contains these fields:
| Parameter | Data type | Required | Description |
|---|---|---|---|
store_id | String | Yes | Default store ID: numeric iTunes Store ID for iOS, or the ID in the default Android store, such as a Google Play bundle ID or Huawei app ID. |
bundle_id | String | Yes | Bundle ID of this platform’s app. |
channel_setup | Object | No | Partner configuration for this platform. |
stores | Object | No | Additional Android stores. Android only. |
The template must have every requested platform configured. If a platform is missing from the template, the request fails before any app changes.
To add a platform to an existing app, include the existing platform’s identifiers and the new platform’s settings in the same request.
To migrate only one platform of an existing multi-platform app, include only that platform in platforms. Other platform configurations and the app’s default platform are preserved. Platform IDs belonging to different apps can’t be combined into one app.
Legacy requests
Legacy requests with top-level platform, store_id, and bundle_id keep the original flat response. Optional channel_setup and stores also stay at the top level. Use either this format or platforms in a request. See legacy examples.
Additional Android stores
Use platforms.android.stores to add another Android store or update an existing non-default store ID. Legacy requests and POST /app/{app_token} accept top-level stores. If you omit this field, additional stores are unchanged.
The default store is the store marked default_store: true in the app’s platform settings. This is separate from the default platform.
Each key is a Dashboard store name, such as huawei, amazon, or galaxy. Each value contains only a required, non-blank store_id:
{ "stores": { "huawei": { "store_id": "C123456789" }, "galaxy": { "store_id": "com.example.myapp.galaxy" } }}storesmust contain at least one entry and is supported only for Android apps. Unsupported store names are rejected.- Missing stores are added as non-default stores. Existing non-default store IDs are updated.
- Stores you omit, redirect URLs, and the default store selection are preserved. This field doesn’t remove stores or change the default store ID.
- The app’s default store ID and
bundle_idare unchanged. To change the default store ID, use the top-levelstore_idinPOST /app/{app_token}withoutstores. - Additional stores aren’t copied from the template app.
storesisn’t a migration section or anoverride_settingsfield.
For POST /app, platforms.android.store_id (or legacy top-level store_id) identifies the app in its default store. New Android apps use the template app’s default Android store. Existing apps keep their default store.
All store changes in a request are sent in one platform update. Repeating a request with the same store IDs doesn’t create duplicate stores. Response store_id fields still contain the default store ID; use the App Settings endpoint with sections=app_info to retrieve the configured stores.
Sections
Use the sections parameter to migrate only specific settings:
{ "sections": ["partners", "events", "fraud_prevention_settings"]}For requests with both platforms, sections run as follows:
| Sections | Platform |
|---|---|
partners, purchase_verification | Each requested platform |
signature | Android |
skad_network_v4, attribution_privacy_model | iOS |
| All other sections | Once for the app |
For a complete list of available sections, see App sections. The app_info section is read-only. You can retrieve it with the App Settings endpoint, but the API rejects it in sections with a validation_error.
Override settings
Use override_settings to customize specific settings for an app instead of using the template app values. Override settings are saved and applied to subsequent migrations automatically.
There are three operations you can perform with override settings:
| Operation | How |
|---|---|
| View | Use GET /app/{app_token}/settings to view current app settings. Use GET /app/{app_token} to view saved override payload in additional_info.overrides. |
| Create / Update | Send override_settings to either POST /app or POST /app/{app_token}. New values are merged into saved overrides, so you can send only fields you want to change. |
| Clear | Call POST /app/{app_token} with "override_settings": null to remove all saved overrides for the app. |
For partners overrides:
- Use the
partnersarray shape fromGET /app/{app_token}/settings. - Partners are matched by
name. - Supported forwarding flags:
revenue_forwarding,session_forwarding,parameter_forwarding,cost_forwarding,attributed_only,uninstall_forwarding,ad_revenue_forwarding,limited_data_use,inactive_user_definition. channel_setupis a flat key-value map of partner-specific fields. Keys not supported by the partner may be ignored by Dashboard API.events_linkingis a map from app event name to partner event name. See Event linking.- Overrides apply to a single app per request. To apply them to many apps, save them as overrides and migrate, or repeat the request for each app.
app_infois a read-only section and is not supported inoverride_settings.- Values in
platforms.<platform>.channel_setup(or legacy top-levelchannel_setup) have highest priority. - Missing values fall back to the channel setup saved for that platform.
override_settings.partners[].channel_setupis used as an additional fallback source.
For s2s overrides:
- Use the shape returned by
GET /app/{app_token}/settings. s2s_authentication_scopesets the endpoints that require S2S authentication on the target app.s2s_session_tracking_enabledsets session endpoint access. This is a separate app setting, so you enable it independently ofs2s_authentication_scope.- Tokens are matched by
label. Thetokenvalue of an override is ignored, and inactive tokens of the template app aren’t migrated. - If the target app has no token with the given
label, a token is created with thescopeyou provide. The supported scope keys areevent,session,ad_revenue, andgdpr. - For a token that already exists, only the
activeflag is aligned. Its scope isn’t changed.
{ "override_settings": { "s2s": { "s2s_authentication_scope": ["install", "session"], "s2s_session_tracking_enabled": true, "tokens": [ { "label": "main", "active": true, "scope": { "event": true, "session": true, "ad_revenue": true, "gdpr": true } } ] } }}{ "override_settings": { "partners": [ { "name": "facebook", "revenue_forwarding": false, "session_forwarding": false, "parameter_forwarding": false, "cost_forwarding": false, "attributed_only": false, "uninstall_forwarding": false, "ad_revenue_forwarding": false, "limited_data_use": true, "inactive_user_definition": false, "channel_setup": { "app_id": "651107451918933" }, "events_linking": { "purchase_inapp": "fb_mobile_purchase" } }, { "name": "snapchat", "limited_data_use": false, "channel_setup": { "app_id": "1404426295" } } ] }}Examples
Create or update an Android and iOS app
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My App", "default_platform": "android", "platforms": { "android": { "store_id": "com.example.myapp", "bundle_id": "com.example.myapp" }, "ios": { "store_id": "123456789", "bundle_id": "com.example.myapp.ios" } }}'{ "adjust_app_token": "abc123xyz", "name": "My App", "default_platform": "android", "platforms": { "android": { "store_id": "com.example.myapp", "bundle_id": "com.example.myapp" }, "ios": { "store_id": "123456789", "bundle_id": "com.example.myapp.ios" } }, "ticket_token": "e5b07bb3-b5f3-40a8-8a2d-197d30b6beff", "sk_app_id": null}Both platforms share one adjust_app_token and one ticket_token. Use the status endpoint to track the migration.
Migrate only iOS on an existing multi-platform app
Send this body to POST /app with the existing iOS identifiers. The partner settings below apply to iOS. force_update also runs the migration if the supplied settings haven’t changed.
{ "name": "My App", "platforms": { "ios": { "store_id": "123456789", "bundle_id": "com.example.myapp.ios", "channel_setup": { "facebook": { "app_id": "987654321" } } } }, "sections": ["partners"], "force_update": true}Legacy examples
These examples use the supported flat request and response format.
Create a new Android app
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Android App", "bundle_id": "com.example.myapp", "store_id": "com.example.myapp", "platform": "android"}'{ "adjust_app_token": "abc123xyz", "name": "My Android App", "bundle_id": "com.example.myapp", "store_id": "com.example.myapp", "ticket_token": "e5b07bb3-b5f3-40a8-8a2d-197d30b6beff", "sk_app_id": null}Create or update an Android app with additional stores
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Android App", "bundle_id": "com.example.myapp", "store_id": "com.example.myapp", "platform": "android", "stores": { "huawei": { "store_id": "C123456789" }, "galaxy": { "store_id": "com.example.myapp.galaxy" } }}'This example assumes Google Play is the default store. You can use the same request for an existing app with this default store ID to add or update its additional stores.
Create an iOS app with channel setup
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My iOS App", "bundle_id": "com.example.myiosapp", "store_id": "123456789", "platform": "ios", "channel_setup": { "facebook": { "app_id": "987654321" }, "google": { "link_id": "google_link_123" } }}'{ "adjust_app_token": "xyz789abc", "name": "My iOS App", "bundle_id": "com.example.myiosapp", "store_id": "123456789", "ticket_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "sk_app_id": "86372991152"}Migrate only specific sections
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My App", "bundle_id": "com.example.app", "store_id": "com.example.app", "platform": "android", "sections": ["events", "partners", "callbacks"]}'Force update an existing app
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My App", "bundle_id": "com.example.app", "store_id": "com.example.app", "platform": "android", "force_update": true}'SDK signature configuration
If you use the Adjust Signature library to secure your Android app traffic, you can use the App Automation API to enforce signature validation and manage your app’s certificate fingerprints (android_fingerprints).
How it works
Signature-related settings can be managed in two ways:
- Template app migration via
POST /app. Use this flow to migrate Android certificate fingerprints (android_fingerprints) from the template app and to apply savedoverride_settings.signatureduring migration. - Direct app-level updates via
PATCH /app/{app_token}/signature. Use this flow to update the app-level signature settingsenforce_signature,enforce_signature_post_install_activities, andenforce_signature_post_install_activities_modefor a single app without running a migration.
When you use template app migration:
- All active certificate fingerprints (
android_fingerprints) from your template app are copied to the target app. - Both signature toggles are inherited from your template app:
enforce_signatureand post-install signature validation. - Saved
override_settings.signaturevalues are applied on top of the migrated template settings. - No action from an Account Manager is required. This workflow is available immediately.
For instructions on adding certificate fingerprints to your template app and enabling signature validation, see the SDK signature setup guide.
Override signature settings
Use override_settings.signature to override signature-related settings for template app migration:
- To override only the Android certificate fingerprints, specify
android_fingerprints, an array of objects with afingerprintfield. - To override only the install-signing enforcement setting, specify
enforce_signature. - To control post-install signature validation, specify
strict_signature_checking_enabledandstrict_signing. Set thestatusofstrict_signingtolive,test, orpaused. - To override multiple signature settings, include them together in
override_settings.signature.
If you do not provide signature overrides, both toggles are inherited from the template app.
If you need to update signature settings for a single app without running a template migration, use the Signature endpoint.
Update signature settings
Use the PATCH /app/{app_token}/signature endpoint to update signature settings for a single app without running a template migration. The change is applied immediately and the response returns the resulting settings.
Endpoint: https://automate.adjust.com/app-automation/app/{app_token}/signature
Method: PATCH
| Parameter | Data type | In | Required | Description |
|---|---|---|---|---|
app_token | String | Path | Yes | The Adjust app token. |
enforce_signature | Boolean | Body | No | Controls install signature enforcement. |
enforce_signature_post_install_activities | Boolean | Body | No | Controls post-install signature enforcement. |
enforce_signature_post_install_activities_mode | String | Body | No | Post-install signature mode. One of: production, monitoring. Default when post-install enforcement is enabled and no mode is set: production. |
- Send at least one field in the request body.
- You can only send
enforce_signature_post_install_activities_modewhenenforce_signature_post_install_activitiesistrueor omitted.
curl --location --request PATCH 'https://automate.adjust.com/app-automation/app/abc123xyz/signature' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "enforce_signature": true, "enforce_signature_post_install_activities": true, "enforce_signature_post_install_activities_mode": "monitoring"}'{ "enforce_signature": true, "enforce_signature_post_install_activities": true, "enforce_signature_post_install_activities_mode": "monitoring"}Examples
Migrate signatures from the template app
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Android App", "bundle_id": "com.example.myapp", "store_id": "com.example.myapp", "platform": "android", "sections": ["signature"], "force_update": true}'Override only android_fingerprints
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Android App", "bundle_id": "com.example.myapp", "store_id": "com.example.myapp", "platform": "android", "sections": ["signature"], "override_settings": { "signature": { "android_fingerprints": [ { "fingerprint": "AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AB" } ] } }}'Override only enforce_signature
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Android App", "bundle_id": "com.example.myapp", "store_id": "com.example.myapp", "platform": "android", "sections": ["signature"], "override_settings": { "signature": { "enforce_signature": true } }, "force_update": true}'Override both android_fingerprints and enforce_signature
curl --location 'https://automate.adjust.com/app-automation/app' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Android App", "bundle_id": "com.example.myapp", "store_id": "com.example.myapp", "platform": "android", "sections": ["signature"], "override_settings": { "signature": { "android_fingerprints": [ { "fingerprint": "AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AB" }, { "fingerprint": "BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BB:BC" } ], "enforce_signature": true } }, "force_update": true}'Update app settings
Update the name, default store ID, or bundle ID of an existing app. You can also manage saved override_settings for future migrations or add and update additional Android stores.
- Without
stores, providenameand at least one ofstore_idorbundle_id. - With
stores,nameandoverride_settingsare optional. Don’t combinestoreswith top-levelstore_idorbundle_id.
API protocol
Endpoint: https://automate.adjust.com/app-automation/app/{app_token}
Method: POST
Response: Update App Response
Parameters
| Parameter | Data type | In | Required | Description |
|---|---|---|---|---|
app_token | String | Path | Yes | The Adjust app token. |
name | String | Body | Conditional | New display name. Required when stores is omitted. |
store_id | String | Body | No | New default store ID. iOS: iTunes Store ID. Android: ID in the app’s default store. Not allowed with stores. |
bundle_id | String | Body | No | New iOS bundle ID. Not allowed with stores. |
override_settings | Object | Body | No | Updates saved override settings for future migrations. Set to null to clear all saved overrides. |
stores | Object | Body | No | Additional Android stores to add or update. Preserves the default store ID and bundle ID. |
Example
curl --location 'https://automate.adjust.com/app-automation/app/abc123xyz' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Renamed App", "store_id": "com.example.newapp"}'{ "store_id": "com.example.newapp", "name": "My Renamed App", "ticket_token": "f1e2d3c4-b5a6-7890-1234-567890abcdef"}Add or update additional Android stores without a migration
curl --location 'https://automate.adjust.com/app-automation/app/abc123xyz' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "stores": { "huawei": { "store_id": "C123456789" }, "galaxy": { "store_id": "com.example.myapp.galaxy" } }}'{ "store_id": "com.example.myapp", "name": "My Android App", "ticket_token": "f1e2d3c4-b5a6-7890-1234-567890abcdef"}The update completes before the response is returned. The default store ID and bundle ID remain unchanged, and no template migration is queued.
Clear saved override settings
curl --location 'https://automate.adjust.com/app-automation/app/abc123xyz' \--header 'Authorization: Bearer {your-adjust-api-token}' \--header 'Content-Type: application/json' \--data '{ "name": "My Renamed App", "store_id": "com.example.newapp", "override_settings": null}'Get app by store ID
Retrieve app details using the default store ID and platform. This lookup doesn’t search IDs of additional stores supplied in stores.
Use the optional store filter when multiple apps have the same default store ID and platform. Without it, an ambiguous lookup returns an error. If the lookup is still ambiguous with store, get the app by token.
API protocol
Endpoint: https://automate.adjust.com/app-automation/app
Method: GET
Response: Get App Response
Parameters
| Parameter | Data type | In | Required | Description |
|---|---|---|---|---|
store_id | String | Query | Yes | Default store ID. iOS: iTunes Store ID. Android: ID in the default store. |
platform | String | Query | Yes | Target platform. One of: android, ios. |
store | String | Query | No | Default store filter, such as google, huawei, amazon, or galaxy. Use itunes for iOS. |
For Google Play, the store filter value is google, not the Dashboard store name google_play used in stores.
Example
curl --location 'https://automate.adjust.com/app-automation/app?store_id=com.example.myapp&platform=android' \--header 'Authorization: Bearer {your-adjust-api-token}'{ "name": "My Android App", "store_id": "com.example.myapp", "platform": "android", "adjust_app_token": "abc123xyz", "additional_info": { "overrides": {} }, "channel_setup": { "facebook": { "app_id": "123456789" }, "google": { "link_id": "adwords_link_id" } }, "cross_promo_token": "hgj3li1"}Filter by default store
This example retrieves an app whose default store is Huawei:
curl --location 'https://automate.adjust.com/app-automation/app?store_id=C123456789&platform=android&store=huawei' \--header 'Authorization: Bearer {your-adjust-api-token}'Get app by token
Retrieve app details using the Adjust app token.
The response contains one platform’s details. To select a specific platform, look up the app by store ID and platform.
API protocol
Endpoint: https://automate.adjust.com/app-automation/app/{app_token}
Method: GET
Response: Get App Response
Parameters
| Parameter | Data type | In | Required | Description |
|---|---|---|---|---|
app_token | String | Path | Yes | The Adjust app token. |
Example
curl --location 'https://automate.adjust.com/app-automation/app/abc123xyz' \--header 'Authorization: Bearer {your-adjust-api-token}'{ "name": "My Android App", "store_id": "com.example.myapp", "platform": "android", "adjust_app_token": "abc123xyz", "additional_info": { "overrides": {} }, "channel_setup": { "facebook": { "app_id": "123456789" } }, "cross_promo_token": "hgj3li1"}List all apps
Retrieve a list of all apps in your account. You can optionally filter by creation date.
API protocol
Endpoint: https://automate.adjust.com/app-automation/apps/list
Method: GET
Response: Array of App Name Token objects
Parameters
| Parameter | Data type | In | Required | Description |
|---|---|---|---|---|
start_date | String | Query | No | Filter apps created on or after this date. ISO 8601 format (e.g., 2024-01-01T00:00:00Z). |
end_date | String | Query | No | Filter apps created on or before this date. ISO 8601 format. |
Example
curl --location 'https://automate.adjust.com/app-automation/apps/list' \--header 'Authorization: Bearer {your-adjust-api-token}'[ { "name": "My Android App", "token": "abc123xyz" }, { "name": "My iOS App", "token": "xyz789abc" }, { "name": "Another App", "token": "def456uvw" }]Filter by date range
curl --location 'https://automate.adjust.com/app-automation/apps/list?start_date=2024-01-01T00:00:00Z&end_date=2024-06-30T23:59:59Z' \--header 'Authorization: Bearer {your-adjust-api-token}'Data models
Create/Update App Payload
See Parameters for app fields and Platforms for each platform’s settings. The legacy flat format remains supported.
Additional Store Update
Each entry in stores accepts only the following field:
| Parameter | Data type | Description |
|---|---|---|
store_id* | String | Non-blank app ID in this store. |
App Migration Response
| Parameter | Data type | Description |
|---|---|---|
adjust_app_token* | String | App token shared by all requested platforms. |
name* | String | Display name of the app. |
default_platform* | String | Platform used for shared settings in this migration. |
platforms* | Object | Requested platforms, each with store_id and bundle_id. |
ticket_token* | String | UUID for the status endpoint. |
sk_app_id | String | StoreKit app ID. null if not applicable. |
Legacy requests return top-level store_id and bundle_id instead of platforms and default_platform.
Get App Response
| Parameter | Data type | Description |
|---|---|---|
name* | String | Display name of the app. |
store_id* | String | Default store ID of the app. |
platform* | String | Target platform: android or ios. |
adjust_app_token* | String | The Adjust app token. |
additional_info* | Object | Additional app information including override settings. |
channel_setup | Object | Partner-specific configuration. |
cross_promo_token | String | Cross-promotion link token. |
Update App Response
| Parameter | Data type | Description |
|---|---|---|
store_id* | String | Default store ID. Unchanged for updates using stores. |
name* | String | Updated display name. |
ticket_token* | String | UUID to track the update job status. |
App Name Token
| Parameter | Data type | Description |
|---|---|---|
name* | String | Display name of the app. |
token* | String | Adjust app token. |