Skip to main content

Adjust - Receive Callback

Endpoint

/i/adjust

Enterprise Only
This API is available exclusively in Countly Enterprise.

Overview

Receives Adjust callback payloads and attempts to attribute them to users by adjust_id.

If a matching user exists, attribution is applied immediately.
If no matching user exists, payload is stored for deferred attribution.

Authentication

Authentication Methods:

  • App key parameter: app_key

Permissions

  • No admin/API-key permission is required.
  • Request is accepted only when app is valid and not paused.
  • App lock rejection applies to populator requests.

Request Parameters

ParameterTypeRequiredDescription
app_keyStringYesApplication key used to resolve target app
adjust_idStringNoAdjust device identifier used for user matching (strongly recommended)
eventStringNoAdjust event name; used to build attributed event key (adjust_<event>)
tracker_nameStringNoTracker name from callback payload
last_tracker_nameStringNoLast tracker name
first_tracker_nameStringNoFirst tracker name
outdated_tracker_nameStringNoOutdated tracker name
adgroup_nameStringNoAd group name
network_nameStringNoNetwork name
campaign_nameStringNoCampaign name
creative_nameStringNoCreative name
installed_atStringNoInstall timestamp from callback
click_timeStringNoClick timestamp from callback
Other callback fieldsStringNoAdditional Adjust fields are accepted and stored/attributed

Response

Success Response

Immediate attribution example:

{
"result": "Success",
"status": "attributed"
}

Deferred attribution storage example:

{
"result": "Success",
"Records inserted": 1,
"document": {
"event": "install",
"campaign_name": "Spring Campaign"
},
"user": null
}

Response Fields

FieldTypeDescription
resultStringResult message (Success on successful processing)
statusStringAttribution status (present on immediate attribution path)
Records insertedNumberNumber of inserted rows in deferred path
documentObjectStored callback payload in deferred path
userObject or nullMatched user object, if available

Error Responses

  • HTTP 400 - Missing app key:
{
"result": "Missing parameter \"app_key\""
}
  • HTTP 400 - App not found:
{
"result": "App does not exist"
}
  • HTTP 400 - App paused:
{
"result": "App is currently not accepting data"
}
  • HTTP 400 - User lookup failure:
{
"result": "Error finding user: <error>"
}
  • HTTP 400 - Deferred save failure:
{
"result": "Error saving data: <error> <payload>"
}
  • HTTP 403 - App locked (populator flow):
{
"result": "App is locked"
}

Behavior/Processing

  1. Validates app_key and resolves app.
  2. Rejects paused apps.
  3. Rejects locked apps only for populator traffic.
  4. Tries to find user by custom.adjust_id.
  5. If matched, attributes immediately and returns status: attributed.
  6. If unmatched, stores payload in countly.adjust and returns insert details.

Database Collections

CollectionUsed forData touched by this endpoint
countly.appsApp configuration and metadataStores app-level feature settings and metadata used or modified by this endpoint.
countly.app_users{appId}Per-app user profilesStores user-level properties and profile fields affected by this endpoint.
countly.adjustEndpoint data sourceStores endpoint-related records this endpoint reads or modifies.

Examples

Example 1: Install callback with attribution ID

curl "https://your-server.com/i/adjust?app_key=YOUR_APP_KEY&adjust_id=abc123&event=install&campaign_name=Spring_Campaign"

Example 2: Callback with tracker fields

curl "https://your-server.com/i/adjust?app_key=YOUR_APP_KEY&adjust_id=abc123&event=click&tracker_name=paid_social&network_name=Meta"

Limitations

  • app_key is mandatory.
  • If adjust_id is omitted, reliable user matching is not guaranteed.
  • Paused apps reject ingestion.
  • Locked app rejection is specific to populator requests.

Ⓔ Enterprise

This feature is part of Countly Enterprise.

Get Access:

Already a Customer? Use support portal if you have any questions.

Last Updated

2026-02-15

Last Updated

2026-02-16