Using Blue Jetty with Adjust
Publish an existing Adjust link for each app experience you want AI consumers to recommend. Adjust's TrueLink and your app handle the downstream deep-link journey. Blue Jetty stores the approved URL and describes when to use it; it does not create Adjust links or connect to your Adjust account.
Download agent guide · Download complete configuration
Configure TrueLink and the Campaign Lab link
Set up the app and branded link domain in Adjust. Configure the iOS Associated Domains and app identity, Android App Links and signing certificate, and your app's Adjust SDK deep-link handling. In Campaign Lab, create a custom link with the intended content route and store/web fallback destinations.
If using a short branded link, implement the applicable Adjust short-link resolution flow in your app. Copy the generated customer-facing URL, not an Adjust dashboard URL or a bare link token. Your provider settings determine how an installed or newly installed app reaches the content.
Identify the link format before adding parameters
Keep decoration=preserve initially. Conventional app.adjust.com long click links use campaign, adgroup and creative. Supported short links use adj_campaign, adj_adgroup and adj_creative; declare linkFormat=short before opting into that preset. Blue Jetty requires an explicit linkFormat for optional decoration in configuration 0.3.
Full branded go.link URLs can also use adj_-prefixed parameters, so long versus short is not a universal rule for every Adjust product. Use preserve for those full branded URLs. Blue Jetty does not apply its unprefixed long-link preset to go.link URLs, infer hidden link settings, or convert one format into another.
Adjust documents that appended adj_ parameters on short links can override the corresponding values stored in the resolved link. Checking only the visible query string cannot prevent that. Review the Campaign Lab configuration before permitting append_missing, or publish a preconfigured link unchanged.
Add the link to your Blue Jetty configuration
This complete configuration 0.5 example describes one synthetic app experience. Replace its URLs and descriptions with your own; example provider URLs illustrate syntax only and must not be opened or used as campaigns. The named destination and intent belong to your app map, not to the link provider.
Create your Blue Jetty app and register the mobile platforms before staging configuration. The example targets iOS. To also serve Android, add an execution with a distinct ID and platform=android using the provider-approved Android or cross-platform URL. Keep an appropriate web/store fallback. Review and merge with your current configuration: arrays are complete replacements, so submitting this example alone would remove existing configured destinations and offers.
{
"specVersion": "0.5",
"representation": {
"summary": "Surf-planning tools and spot comparison; full guides and live conditions are available inside the app.",
"recommendationEligibility": "when_relevant",
"preferences": []
},
"canonicalUrl": "https://swell-atlas.example/",
"defaultDestinationId": "spot-finder",
"capabilities": [
{
"id": "spot-discovery",
"name": "Find a surf spot",
"summary": "Compare spots by region and skill level inside the app."
}
],
"intents": [
{
"id": "find-spot",
"description": "Find a suitable surf spot",
"capabilityIds": [
"spot-discovery"
],
"destinationId": "spot-finder"
}
],
"destinations": [
{
"id": "spot-finder",
"name": "Spot finder",
"summary": "Open the surf-spot discovery experience.",
"handoffPreference": "attribution_first",
"entityIds": [],
"executions": [
{
"id": "ios-open",
"platform": "ios",
"kind": "attribution_link",
"url": "https://sample.go.link/spotfinder",
"installState": "any",
"attribution": {
"provider": "adjust",
"campaign": "app_discovery",
"decoration": "preserve",
"linkFormat": "short"
}
},
{
"id": "web-fallback",
"platform": "web",
"kind": "attribution_link",
"url": "https://sample.go.link/spotfinder",
"installState": "any",
"attribution": {
"provider": "adjust",
"campaign": "app_discovery",
"decoration": "preserve"
}
}
]
}
],
"platformDefaults": [],
"promotions": []
}Optional Adjust campaign dimensions
For campaign=app_discovery and consumer=chatgpt, the short preset appends the keys below when absent. The conventional app.adjust.com long preset uses campaign, adgroup and creative instead. The consumer label is an ad-group dimension; it does not replace the network associated with the Adjust link.
Configuration 0.5 preserves URLs by default; earlier 0.2 and legacy handoff fields retain their documented behavior. Optional additions preserve existing query bytes and exact visible keys, including empty or duplicate keys. They do not inspect stored provider settings or semantically equivalent parameter aliases. Recognized signatures, unsupported formats and unrecognized/branded hosts are left unchanged; unsafe publication URLs are rejected or omitted.
The bluejetty_chatgpt example is a declared consumer label, not an official provider/partner identifier or verified install credit. Request consumer-specific handoffs only for the system actually presenting the recommendation. Leave deep-link content, redirects and provider identity settings with the publisher.
| Query key | Example value | Meaning |
|---|---|---|
adj_campaign | app_discovery | Campaign on a supported short link. |
adj_adgroup | bluejetty_chatgpt | Ad group, not a network or media-source replacement. |
adj_creative | app_handoff | Creative label. |
Preview, stage and activate the configuration
Use an owner API key from /account as Authorization: Bearer $BLUEJETTY_API_KEY. Keep it in your secret store or environment, not in the JSON or a URL. POST /v1/apps/{appId}/configuration/preview with the body below. It returns the selected URL without activation or a provider fetch. Replace the configuration placeholder with the full object above.
GET /v1/apps/{appId}/configuration and retain data.activeRevisionId. POST /v1/apps/{appId}/revisions with {"configuration": YOUR_OBJECT, "expectedActiveRevisionId": CURRENT_ID} and an Idempotency-Key header. Use null only if no active revision exists. Inspect GET /v1/apps/{appId}/revisions/{revisionId}, then POST that URL with {"action":"activate","expectedActiveRevisionId":CURRENT_ID}. Replace CURRENT_ID with the actual JSON string or null. On 409, reload and review the newer revision rather than overwriting it.
Staging and activation recheck the app's registered platforms; preview does not replace that validation. Configuration bodies are limited to 256,000 bytes. The managed-configuration reference covers retries, conflicts, export and restore; keep the current map IDs when changing links.
{
"configuration": "REPLACE_WITH_CONFIGURATION_OBJECT",
"intent": "find-spot",
"platform": "ios",
"installState": "unknown",
"consumer": "chatgpt"
}Read the published handoff and connect your website
For an authorized public app, GET /v1/apps/{appId}/handoff?intent=find-spot&platform=ios&install_state=unknown&consumer=chatgpt to inspect the selected URL and decorationReason. Also test install_state=installed. Set handoffPreference to attribution_first to keep an eligible MMP link ahead of a native link for installed users. Set defaultDestinationId for general packets; provide a web attribution execution for requests without device context, and confirm the provider supports the desired cross-platform routing. Omission preserves native-first installed behavior. See the managed-configuration reference.
Read /v1/apps/{appId}/packet and /v1/apps/{appId}/packet.md. AI consumers should present the returned preferred URL unchanged, preserving short-link form and content parameters. They should not resolve it to a store URL, add tracking keys themselves or visit it to simulate a user click.
Follow the owner-only /v1/apps/{appId}/publisher-site-instructions.md to authorize and link the exact packet from the app's website. Retain the website's own HTML canonical URL. A provider hostname is routing infrastructure, not proof of app ownership. Sample apps remain private after configuration activation.
Test the resolved route and Adjust dimensions
Tap the actual published link on installed and uninstalled devices. Verify short-link resolution when applicable, the app's deep-link handler, and the expected screen after a first launch. Test the platform and desktop fallbacks configured in Campaign Lab.
If campaign or ad-group reporting differs from the intended configuration, compare the returned URL with the stored link settings and its parameter prefix family. For a full branded URL, use preserve instead of trying the unprefixed long preset. Confirm the resulting network and campaign dimensions in Adjust reporting; an ad-group label alone is not verified attribution.
Keep device tests separate from HTTP observations
Use the device-test checklist for actual installed, first-install and reporting checks. Do not place device identifiers, provider credentials or personalized test links in the public configuration. Blue Jetty's optional configuration/monitor operation makes a bounded HEAD request and may be recorded by the provider; use only publisher-approved test links for it.
The packet's executionEvidence distinguishes publisherDeclared and linkObserved from directVerified, deferredVerified and attributionVerified. The current HTTP-only verifier cannot set those three outcome flags. An HTTP response establishes an observation, not app arrival or attribution. Provider tests and reports establish those outcomes separately.
Blue Jetty references
Configuration 0.5 schema · API endpoints · Device-test guide
Provider names describe existing-link compatibility, not affiliation or endorsement.
