Attribution


How It Works

When a user clicks a DynaLink, the Dynalink fingerprint page runs in the browser before the redirect. It:

  1. Reads any ad-network click IDs present in the URL (gclid, fbclid, ttclid, etc.).
  2. Builds a device fingerprint: {IP}-{OS}-{OSVersion}-{ScreenResolution}.
  3. Stores the fingerprint + click IDs server-side.
  4. Redirects the user to the App Store (iOS) or Play Store (Android).

After the user installs and opens the app, the SDK re-generates the fingerprint (or reads the Android install referrer), finds the matching record, marks it as confirmed (confirmed_at), and calls the attribution API to retrieve the captured click IDs.

The attribution API is therefore only useful after the SDK has called mark-as-processed. Unconfirmed fingerprints return 404.

All attribution endpoints require the x-project-key header.

By Fingerprint

GET https://dynalink.app/api/attribution/fingerprint/{fingerprint}

Returns attribution data for a specific device fingerprint string ({IP}-{OS}-{Version}-{Resolution}).

curl https://dynalink.app/api/attribution/fingerprint/203.0.113.5-iOS-17.4-390x840 \
  -H "x-project-key: YOUR_PROJECT_KEY"

By DynaLink Code

GET https://dynalink.app/api/attribution/code/{code}

Returns the most recent confirmed attribution for a given short code. Useful when the deep link opens an already-installed app — the click IDs may not be in the URI params but are retrievable here.

curl https://dynalink.app/api/attribution/code/SUMR99 \
  -H "x-project-key: YOUR_PROJECT_KEY"

Response Reference

Both endpoints return the same shape.

Success (HTTP 200)

{
  "matched": true,
  "dyna_code": "SUMR99",
  "gclid": "Cj0KCQjw...",
  "gbraid": null,
  "fbclid": "FB.AbCdEfGh...",
  "fbclid_captured_at": 1716211200,
  "ttclid": null,
  "twclid": null,
  "li_fat_id": null,
  "campaign_id": 4,
  "campaign_name": "Summer 2026",
  "utm_source": "google",
  "utm_medium": "cpc",
  "utm_campaign": "summer_2026",
  "utm_term": null,
  "utm_content": null,
  "attributed_at": "2026-05-21T10:05:00Z"
}

Not found (HTTP 404)

{ "matched": false }
Field Type Description
matched boolean Whether a confirmed attribution was found
dyna_code string Short code of the matched link
gclid string Google Ads click ID
gbraid string Google Ads enhanced click ID (iOS 14.5+)
fbclid string Meta (Facebook/Instagram) click ID
fbclid_captured_at integer Unix timestamp when fbclid was first captured
ttclid string TikTok click ID
twclid string X (Twitter) click ID
li_fat_id string LinkedIn first-party ad tracking ID
campaign_id integer Associated campaign ID
campaign_name string Campaign display name
utm_source string UTM source
utm_medium string UTM medium
utm_campaign string UTM campaign slug
utm_term string UTM term
utm_content string UTM content
attributed_at string ISO 8601 UTC timestamp when the install was confirmed

Click ID Reference

Field Ad Network What to do with it
gclid Google Ads Import as a conversion via the Google Ads API
gbraid Google Ads (iOS 14.5+) Use with Google Enhanced Conversions
fbclid Meta (Facebook / Instagram) Send as an install event to the Facebook CAPI
ttclid TikTok Send to the TikTok Events API
twclid X (Twitter) Send to the X Ads conversion API
li_fat_id LinkedIn Pass to the LinkedIn Insight Tag

{tip} The Dynalink Flutter SDK handles the full attribution flow automatically and exposes all click IDs on the DynalinkEvent. You only need this API directly if you are building a custom integration.