adjust-icon

App endpoint

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

  1. The API looks for an existing app using its default store ID and platform.
  2. If no app exists, a new app is created with the provided details.
  3. If you provide stores, additional Android stores are added or updated on the target app.
  4. A background job is queued to copy settings from your template app when migration is needed.
  5. The response includes a ticket_token to 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, or ios_pv_shared_secrets fields are updated
  • force_update is set to true

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

ParameterData typeRequiredDescription
store_idStringYesDefault store ID. iOS: numeric iTunes Store ID. Android: ID in the default store, such as a Google Play bundle ID or Huawei app ID.
platformStringYesTarget platform. One of: android, ios.
bundle_idStringYesBundle ID of the app (e.g., com.example.app).
nameStringYesDisplay name of the app.
template_app_tokenStringNoApp token to copy settings from. If not provided, uses the token configured in your account.
sectionsArray[String]NoList of app sections to migrate. If empty, all sections are migrated.
force_updateBooleanNoSet to true to force a migration job even if the app hasn’t changed. Default: false.
channel_setupObjectNoPartner-specific configuration. See Channel setup for details.
override_settingsObjectNoSettings to override from the template app. See Override settings for details.
currencyStringNoCurrency 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.
editorsArray[String]NoEmail addresses of custom users who should have access to the app. Admin, editor, and reader role users get access automatically.
ios_pv_shared_secretStringNoiOS Purchase Verification shared secret for this app.
verificationBooleanNoSet to true to verify an iOS app. Only applies to iOS apps with verification enabled for your account. Default: false.
storesObjectNoAdditional 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" }
}
}
  • stores must 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_id are unchanged. To change the default store ID, use the top-level store_id in POST /app/{app_token} without stores.
  • Additional stores aren’t copied from the template app. stores isn’t a migration section or an override_settings field.

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:

OperationHow
ViewUse 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 / UpdateSend 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.
ClearCall POST /app/{app_token} with "override_settings": null to remove all saved overrides for the app.

For partners overrides:

  • Use the partners array shape from GET /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_setup is a flat key-value map of partner-specific fields. Keys not supported by the partner may be ignored by Dashboard API.
  • events_linking is a map from app event name to partner event name.
  • app_info is a read-only section and is not supported in override_settings.
  • channel_setup values from the request-level channel_setup field have highest priority.
  • If a key is missing in request-level channel_setup, App Automation falls back to stored app channel_setup.
  • override_settings.partners[].channel_setup is used as an additional fallback source.

For s2s overrides:

  • Use the shape returned by GET /app/{app_token}/settings.
  • s2s_authentication_scope sets the endpoints that require S2S authentication on the target app.
  • s2s_session_tracking_enabled sets session endpoint access. This is a separate app setting, so you enable it independently of s2s_authentication_scope.
  • Tokens are matched by label. The token value 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 the scope you provide. The supported scope keys are event, session, ad_revenue, and gdpr.
  • For a token that already exists, only the active flag is aligned. Its scope isn’t changed.
S2S override settings example
{
"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 example
{
"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

Request - cURL
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"
}'
Response
{
"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

Request - cURL
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

Request - cURL
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" }
}
}'
Response
{
"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

Request - cURL
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

Request - cURL
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 saved override_settings.signature during migration.
  • Direct app-level updates via PATCH /app/{app_token}/signature. Use this flow to update the app-level signature settings enforce_signature, enforce_signature_post_install_activities, and enforce_signature_post_install_activities_mode for 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_signature and post-install signature validation.
  • Saved override_settings.signature values 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 a fingerprint field.
  • To override only the install-signing enforcement setting, specify enforce_signature.
  • To control post-install signature validation, specify strict_signature_checking_enabled and strict_signing. Set the status of strict_signing to live, test, or paused.
  • 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

ParameterData typeInRequiredDescription
app_tokenStringPathYesThe Adjust app token.
enforce_signatureBooleanBodyNoControls install signature enforcement.
enforce_signature_post_install_activitiesBooleanBodyNoControls post-install signature enforcement.
enforce_signature_post_install_activities_modeStringBodyNoPost-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_mode when enforce_signature_post_install_activities is true or omitted.
Request - cURL
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"
}'
Response
{
"enforce_signature": true,
"enforce_signature_post_install_activities": true,
"enforce_signature_post_install_activities_mode": "monitoring"
}

Examples

Migrate signatures from the template app

Request - cURL
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

Request - cURL
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

Request - cURL
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

Request - cURL
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, provide name and at least one of store_id or bundle_id.
  • With stores, name and override_settings are optional. Don’t combine stores with top-level store_id or bundle_id.

API protocol

Endpoint: https://automate.adjust.com/app-automation/app/{app_token}

Method: POST

Response: Update App Response

Parameters

ParameterData typeInRequiredDescription
app_tokenStringPathYesThe Adjust app token.
nameStringBodyConditionalNew display name. Required when stores is omitted.
store_idStringBodyNoNew default store ID. iOS: iTunes Store ID. Android: ID in the app’s default store. Not allowed with stores.
bundle_idStringBodyNoNew iOS bundle ID. Not allowed with stores.
override_settingsObjectBodyNoUpdates saved override settings for future migrations. Set to null to clear all saved overrides.
storesObjectBodyNoAdditional Android stores to add or update. Preserves the default store ID and bundle ID.

Example

Request - cURL
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"
}'
Response
{
"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

Request - cURL
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" }
}
}'
Response
{
"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

Request - cURL
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

ParameterData typeInRequiredDescription
store_idStringQueryYesDefault store ID. iOS: iTunes Store ID. Android: ID in the default store.
platformStringQueryYesTarget platform. One of: android, ios.
storeStringQueryNoDefault 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

Request - cURL
curl --location 'https://automate.adjust.com/app-automation/app?store_id=com.example.myapp&platform=android' \
--header 'Authorization: Bearer {your-adjust-api-token}'
Response
{
"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:

Request - cURL
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

ParameterData typeInRequiredDescription
app_tokenStringPathYesThe Adjust app token.

Example

Request - cURL
curl --location 'https://automate.adjust.com/app-automation/app/abc123xyz' \
--header 'Authorization: Bearer {your-adjust-api-token}'
Response
{
"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

ParameterData typeInRequiredDescription
start_dateStringQueryNoFilter apps created on or after this date. ISO 8601 format (e.g., 2024-01-01T00:00:00Z).
end_dateStringQueryNoFilter apps created on or before this date. ISO 8601 format.

Example

Request - cURL
curl --location 'https://automate.adjust.com/app-automation/apps/list' \
--header 'Authorization: Bearer {your-adjust-api-token}'
Response
[
{
"name": "My Android App",
"token": "abc123xyz"
},
{
"name": "My iOS App",
"token": "xyz789abc"
},
{
"name": "Another App",
"token": "def456uvw"
}
]

Filter by date range

Request - cURL
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

ParameterData typeDescription
store_id*StringDefault store ID. iOS: iTunes Store ID. Android: ID in the default store.
platform*StringTarget platform. One of: android, ios.
bundle_id*StringBundle ID of the app.
name*StringDisplay name of the app.
template_app_tokenStringApp token to copy settings from. Uses configured default if not provided.
sectionsArray[String]App sections to migrate. Migrates all sections if not provided.
force_updateBooleanForce migration even if the app hasn’t changed. Default: false.
channel_setupObjectPartner-specific configuration. See Channel setup.
override_settingsObjectSettings to override from the template app.
currencyStringCurrency 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.
editorsArray[String]Email addresses of users who should have access to the app.
ios_pv_shared_secretStringiOS Purchase Verification shared secret.
verificationBooleanWhether to verify the iOS app. Default: false.
storesObjectDashboard store names mapped to Additional Store Update objects. Android only.

Additional Store Update

Each entry in stores accepts only the following field:

ParameterData typeDescription
store_id*StringNon-blank app ID in this store.

App Migration Response

ParameterData typeDescription
adjust_app_token*StringThe Adjust app token for the created/updated app.
name*StringDisplay name of the app.
bundle_id*StringBundle ID of the app.
store_id*StringDefault store ID of the app. Additional store IDs aren’t returned here.
ticket_token*StringUUID to track the migration job status. Use with the status endpoint.
sk_app_idStringStoreKit app ID for verified iOS apps. null if not applicable.

Get App Response

ParameterData typeDescription
name*StringDisplay name of the app.
store_id*StringDefault store ID of the app.
platform*StringTarget platform: android or ios.
adjust_app_token*StringThe Adjust app token.
additional_info*ObjectAdditional app information including override settings.
channel_setupObjectPartner-specific configuration.
cross_promo_tokenStringCross-promotion link token.

Update App Response

ParameterData typeDescription
store_id*StringDefault store ID. Unchanged for updates using stores.
name*StringUpdated display name.
ticket_token*StringUUID to track the update job status.

App Name Token

ParameterData typeDescription
name*StringDisplay name of the app.
token*StringAdjust app token.