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
This endpoint creates a new app or updates an existing app using settings from your template app. It’s the main entry point for automating app setup.
How it works
- The API looks for an existing app using its default store ID and
platform. - If no app exists, a new app is created with the provided details.
- If you provide
stores, additional Android stores are added or updated on the target app. - 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 is newly created or first imported into App Automation
channel_setup,override_settings,editors, orios_pv_shared_secretsfields are updatedforce_updateis set totrue
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 |
|---|---|---|---|
store_id | String | Yes | Default store ID. iOS: numeric iTunes Store ID. Android: ID in the default store, such as a Google Play bundle ID or Huawei app ID. |
platform | String | Yes | Target platform. One of: android, ios. |
bundle_id | String | Yes | Bundle ID of the app (e.g., com.example.app). |
name | String | Yes | Display name of the app. |
template_app_token | String | No | App token to copy settings from. If not provided, uses the token configured in your account. |
sections | Array[String] | No | List of app sections to migrate. If empty, all sections are migrated. |
force_update | Boolean | No | Set to true to force a migration job even if the app hasn’t changed. Default: false. |
channel_setup | Object | No | Partner-specific configuration. See Channel setup for details. |
override_settings | Object | No | Settings to override from the template app. See Override settings for details. |
currency | String | No | Currency code for the app (e.g., EUR, GBP). If not provided, the currency from the template app is used. Currency can only be set during app creation and can’t be changed afterwards. |
editors | Array[String] | No | Email addresses of custom users who should have access to the app. Admin, editor, and reader role users get access automatically. |
ios_pv_shared_secret | String | No | iOS Purchase Verification shared secret for this app. |
verification | Boolean | No | Set to true to verify an iOS app. Only applies to iOS apps with verification enabled for your account. Default: false. |
stores | Object | No | Additional Android stores to add or update. See Additional Android stores. |
Additional Android stores
Use stores to add another store to an Android app or update the ID of an existing non-default store. Both POST /app and POST /app/{app_token} support this field. If you omit stores, the existing single-store behavior is 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, the required top-level store_id is the app ID in the default store, not an additional 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 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.app_infois a read-only section and is not supported inoverride_settings.channel_setupvalues from the request-levelchannel_setupfield have highest priority.- If a key is missing in request-level
channel_setup, App Automation falls back to stored appchannel_setup. 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 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.
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
| Parameter | Data type | Description |
|---|---|---|
store_id* | String | Default store ID. iOS: iTunes Store ID. Android: ID in the default store. |
platform* | String | Target platform. One of: android, ios. |
bundle_id* | String | Bundle ID of the app. |
name* | String | Display name of the app. |
template_app_token | String | App token to copy settings from. Uses configured default if not provided. |
sections | Array[String] | App sections to migrate. Migrates all sections if not provided. |
force_update | Boolean | Force migration even if the app hasn’t changed. Default: false. |
channel_setup | Object | Partner-specific configuration. See Channel setup. |
override_settings | Object | Settings to override from the template app. |
currency | String | Currency code for the app (e.g., EUR, GBP). If not provided, the currency from the template app is used. Currency can only be set during app creation and can’t be changed afterwards. |
editors | Array[String] | Email addresses of users who should have access to the app. |
ios_pv_shared_secret | String | iOS Purchase Verification shared secret. |
verification | Boolean | Whether to verify the iOS app. Default: false. |
stores | Object | Dashboard store names mapped to Additional Store Update objects. Android only. |
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 | The Adjust app token for the created/updated app. |
name* | String | Display name of the app. |
bundle_id* | String | Bundle ID of the app. |
store_id* | String | Default store ID of the app. Additional store IDs aren’t returned here. |
ticket_token* | String | UUID to track the migration job status. Use with the status endpoint. |
sk_app_id | String | StoreKit app ID for verified iOS apps. null if not applicable. |
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. |