Use the Deep link generator API to create short and long deep links for your apps, individually or in bulk. These customized deep links enhance the user experience across various platforms.
Before you begin
Here’s what you need to know before getting started.
Availability
- You need to be on the TrueLink Core or Enterprise package to get access to the Deep link generator API.
- Links created using the Deep link generator API aren’t displayed in Campaign Lab.
- The TTL (time-to-live) for short links created with the Deep link generator API is 120 days.
Requirements
- Admin, Editor, or Custom Editor permissions.
- Set up the same branded domain for your iOS and Android app.
- For iOS apps, ensure that you add your branded domain as an Associated Domain. This sets the domain to be configured as a Universal Link.
- For Android apps, ensure that you define your branded domain as the Android App Link.
- You need a valid custom link token to generate deep links:
- For a single app (whether single-platform or multi-platform): Create a custom link in Campaign Lab to get a single link token.
- For multiple apps you have two options:
- Create a combined custom link in Campaign Lab. This generates a single link token for multiple apps. See Platform-specific link tokens for details.
- Use two existing custom links and join their tokens with an underscore (
_
), like so:linkTokenA_linkTokenB
.
- Update the Adjust SDK to resolve short links.
- If you’ve set up data residency, make sure you are using the same region for your iOS and Android apps.
Rate Limiting
To ensure optimal performance and fair usage across all clients, the Deep link generator API enforces the following rate limits:
- Per-app limit for short link creation:
- Up to 50 requests per second for creating short links for a single app.
- For bulk link creation requests, up to 100 requests per 2 seconds.
- Per-account limit for all link creation and update operations:
- Up to 200 requests per second across all apps within a single account.
If you exceed any of these limits, the API will respond with a 429 Too Many Requests status. After receiving this response, you must wait until the rate limit window resets before retrying your request.
To avoid hitting these limits, especially in high-throughput scenarios, we recommend implementing:
- Automatic retry logic with an exponential backoff strategy to progressively increase the delay between retries.
- Global concurrency control to effectively limit the number of concurrent requests, such as:
asyncio.Semaphore
in Pythonasync-sema
in Node.js- or
Semaphore
fromjava.util.concurrent
in Java
Proper rate limit handling is essential for maintaining uninterrupted service access and avoiding throttling.
Authentication
The Deep link generator API uses Bearer tokens for authentication. You MUST include your Adjust API token in an Authorization
header with each request you make to the Deep link generator API.
If your organization has enabled Single Sign-On (SSO), contact your Adjust representative or email support@adjust.com for help with finding your API token.
For non-SSO accounts, API tokens are located in a user’s profile. To find your token, follow these steps:
- Select the account (user) icon.
- Select Account settings.
- Select the My profile tab.
- Your API Token is shown with your User Details. Select the copy button to copy the token to your system clipboard.
Reset your Adjust API token
You can reset your Adjust API token at any time. Resetting your token invalidates the old token. If you reset your Adjust API token, you MUST replace your old token anywhere that you’re using it. Requests made with an invalidated token are rejected by Adjust.
To reset your Adjust API token:
- Select the account (user) icon.
- Select Account settings.
- Select the My Profile tab.
- Your API Token is shown with your User details.
- Select Reset API token.
- Enter your account password in the modal that appears and select Reset to reset your API token. A confirmation appears in the top right of the screen.
- Select the copy button next to the API Token to copy the token to your system clipboard.
Quota and Usage
The Deep link generator API allows generating an unlimited number of long links, while the number of short links is subject to your contract terms.
- Only unique short links count against your quota. If the same set of parameters is sent multiple times, the quota is only reduced once.
- Your short link quota is defined in your contract.
- When the quota is exhausted or the contract expires, the API will automatically fall back to generating long links, regardless of the
shorten_url
parameter value.
Requesting current quota information
Execute the following request to retrieve your current quota balance. The response reflects your balance in real time.
Endpoint: https://automate.adjust.com/engage/deep-links/quota
Method: GET
Response: Quota Data
Response headers
Most API responses include headers that provide real-time visibility into your short link quota and contract status:
X-ShortLink-Quota-Limit: 100000 # Total short link quota allocatedX-ShortLink-Quota-Remaining: 86129 # Remaining short link generationsX-Contract-Status: active # Current contract status. One of: "active", "inactive". "inactive" is returned when the contract has ended or the contract information is not yet availableX-Contract-End-Date: 2025-12-31 # Contract expiration dateX-Contract-Start-Date: 2024-12-31 # Contract start date
Generate a single deep link
This operation allows you to generate a long or short deep link for a single-platform, multi-platform, or combined app configuration. Use this when you need to create a single deep link dynamically.
API Protocol
Endpoint: https://automate.adjust.com/engage/deep-links
Method: POST
Request body: Link Generation Payload
Response: Deep-Link Object or Error Response
Examples
Single-platform apps
curl --location 'https://automate.adjust.com/engage/deep-links' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer adjustApiToken' \--data '{ "link_token": "1c52mluz", "redirect": "https://example.com/redirect", "fallback": "https://example.com/fallback", "deep_link_path": "/custom-path" }'
{"url": "https://example.go.link/fryYl"}
Multi-platform apps
curl --location 'https://automate.adjust.com/engage/deep-links' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer adjustApiToken' \--data '{ "link_token": "2d41nkvy", "redirect": "https://example.com/redirect", "fallback": "https://example.com/fallback", "android_deep_link_path": "/custom-path", "redirect_macos": "https://www.example.com/redirectmacos" }'
{ "url": "https://example.go.link/jlbKj" }
Combined links
curl --location 'https://automate.adjust.com/engage/deep-links' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer adjustApiToken' \--data '{ "link_token": "1c2n7ybx_1cjet4nl", "redirect": "https://example.com/redirect", "fallback": "https://example.com/fallback", "ios_deep_link_path": "/custom-path-ios", "android_deep_link_path": "/custom-path-android", "redirect_macos": "https://www.example.com/redirectmacos" }'
{"url": "https://example.go.link/6JtQx"}
Generate deep links in bulk
Use this operation to generate multiple deep links in a single request. It supports both long and short links for various app types. Use bulk generation to optimize performance and reduce request overhead when creating up to 100 links at once.
API Protocol
Endpoint: https://automate.adjust.com/engage/deep-links/bulk
Method: POST
Request body:
Parameter | Data type |
---|---|
data* | Array[Link Generation Payload] |
Response:
Parameter | Data type |
---|---|
data* | Array[Deep-Link or Error Response] |
Example
curl --location 'https://automate.adjust.com/engage/deep-links/bulk' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer adjustApiToken' \--data '{"data": [ { "link_token": "1doptv0c", "redirect": "https://example.com/redirect", "fallback": "https://example.com/fallback", "campaign": "custom-campaign" }, { "link_token": "ERRORDATA" }, { "link_token": "1df3xslh_1dsykkaa", "redirect": "https://example.com/redirect", "fallback": "https://example.com/fallback", "ios_deep_link_path": "/custom-path-ios", "android_deep_link_path": "/custom-path-android" }, { "link_token": "1dzwtdjt", "redirect": "https://example.com/redirect", "fallback": "https://example.com/fallback", "android_deep_link_path": "/custom-path" } ]}'
{ "data": [ { "url": "https://example.go.link/4IlkC" }, { "error_code": "service_error", "error_desc": "[ERROR MESSAGE]" }, { "url": "https://example.go.link/6KnoE" }, { "url": "https://example.go.link/5JmnD" } ]}
Retrieve short link data
This operation allows you to retrieve metadata about a previously generated short link, such as its expiration date and redirect parameters. Use this to inspect or verify short link state.
API Protocol
Endpoint: https://automate.adjust.com/engage/deep-links/short-link?short_token={short_token}&app_token={app_token}
Method: GET
Response: Short Token Metadata
Example
curl --location --request GET 'https://automate.adjust.com/engage/deep-links/short-link?short_token=4IlkC&app_token=zgvhg75bw83k' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer adjustApiToken'
{ "created_at": "2025-03-19T13:31:31Z", "expires_at": "2025-10-08T17:04:24.201134367Z", "token": "4IlkC", "ulink": "example", "url": "https://example.go.link/?adj_t=1g41cvql_1gb5zq24&adj_fallback=https%3A%2F%2Fexample.com%2Ffallback-1&adj_redirect=https%3A%2F%2Fexample.com%2Fredirect"}
Update short link target
Use this operation to update the redirect target (long link) of an existing short link. The short link itself remains unchanged.
API Protocol
Endpoint: https://automate.adjust.com/engage/deep-links/{short_token}
Method: PUT
Request body: Link Generation Payload
Response: HTTP 204 No Content
on success
Example
curl --location --request PUT 'https://automate.adjust.com/engage/deep-links/4IlkC' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer adjustApiToken' \--data '{ "link_token": "1doptv0c", "redirect": "https://example.com/new-redirect", "fallback": "https://example.com/new-fallback", "deep_link_path": "/new-custom-path"}'
204 No Content
Data Models
Link Generation Payload
Parameter | Data type | Description |
---|---|---|
link_token * | String | The link token from your custom link. Can be a single token, or multiple tokens combined in the form: linkTokenA_linkTokenB . |
shorten_url | Boolean | Indicates whether the link should be shortened. Default is true . |
short_token | String | A custom short token. Use this parameter to generate a short link with a predefined value. For example, if you pass campaign2026 , the resulting link will be example.go.link/campaign2026 . The token must be unique within one branded domain. |
campaign | String | The custom name of the campaign. Use this parameter to override value from the Custom Link. |
adgroup | String | The custom name of the adgroup. Use this parameter to override value from the Custom Link. |
creative | String | The custom name of the creative. Use this parameter to override value from the Custom Link. |
deep_link_path | String | Specifies the in-app destination users are taken to. Use this for single-platform apps. |
ios_deep_link_path | String | Specifies the iOS in-app destination your users are taken to. Use this for multi-platform iOS apps or combined links. |
android_deep_link_path | String | Specifies the Android in-app destination your users are taken to. Use this for multi-platform Android apps or combined links. |
fallback | String | Landing page for off-platform users. When you specify a fallback URL, we recommend also specifying redirect_macos and redirect_windows . |
redirect | String | Redirect URL to override Adjust’s default redirect. |
redirect_ios | String | Redirect URL that overrides Adjust’s default redirect for iOS apps only. Use this for multi-platform iOS apps or combined links. |
redirect_android | String | Redirect URL that overrides Adjust’s default redirect for Android apps only. Use this for multi-platform Android apps or combined links. |
redirect_macos | String | Redirect URL to override Adjust’s default redirect for macOS. When you specify the fallback , it’s recommended to specify this parameter for macOS users. |
redirect_windows | String | Redirect URL to override Adjust’s default redirect for Windows. When you specify the fallback , it’s recommended to specify this parameter for Windows users. |
label | String | Adds custom data to the link. Use this parameter to add a unique user referral ID that’s autopopulated when a user shares a short link from your app. |
og_title | String | Title of the social sharing preview of the link. |
og_description | String | Description of the social sharing preview of the link. |
og_image | String | URL to a JPG or PNG image of at least 200 x 200 pixels size for the social sharing preview of the link. |
Deep-Link
Parameter | Data type | Description |
---|---|---|
url * | String | Final link: short or long |
long_url * | String | Corresponding long link |
Short Token Metadata
Parameter | Data type | Description |
---|---|---|
created_at * | String | ISO datetime object |
expires_at * | String | ISO datetime object of the short link expiration date |
updated_at | String | ISO datetime object of the last link update |
token * | String | Token |
ulink * | String | Branded domain |
url * | String | Full long link |
Quota Data
Parameter | Data type | Description |
---|---|---|
limit * | Integer | Total short link quota allocated |
remaining * | Integer | Remaining short link generations |
contract_status * | String | Current contract status. One of: “active”, “inactive”. “inactive” is returned when the contract has ended or the contract information is not yet available. |
contract_start_date | String | ISO date object. Contract start date. |
contract_end_date | String | ISO date object. Contract expiration date. |
Error Response
Parameter | Data type | Description |
---|---|---|
error_code * | String | Error code: request_error , auth_error , validation_error , service_error |
error_desc * | String | Human-readable error description |
error_desc_details | Array | Additional metadata |