Build on it
Data export
Every DL2App click, install, app open and in-app event as daily gzipped NDJSON files, sent to your S3-compatible bucket or downloaded.
Raw rows for your warehouse, a spreadsheet or your own analysis. Each file is gzipped NDJSON (one JSON object per line), one per dataset and UTC day. Open Data export in a project to download a day, or connect a bucket and the files arrive there every day.
Send to your bucket
Any storage that speaks the S3 API works: Amazon S3, Cloudflare R2, Google Cloud Storage (with an HMAC key), DigitalOcean Spaces, Backblaze B2, MinIO, Wasabi. Sending to a bucket is on paid plans; downloads are on every plan.
- Create a bucket and a key that can write objects to it. Nothing is ever read, listed or deleted, so give it no more than that.
- Enter the endpoint, region, bucket, an optional folder and the key. The secret is stored encrypted.
- A small test file,
_dl2_check.txt, is written before the settings are saved. If it fails, the error says what to fix.
The previous 7 days are sent first. After that, each day’s files arrive within a few hours after midnight UTC. If a day fails, it is tried again every hour and later days wait for it. After an outage, up to the last 7 days are caught up; download anything older from the dashboard. Send yesterday now sends yesterday’s files straight away. Sending a day again replaces its files.
Where the files go
your-folder/yourapp/clicks/dt=2026-10-13/clicks-2026-10-13.ndjson.gzThe dt= folders are the date-partition layout that Athena, BigQuery and Snowflake read directly. Times are UTC.
What is in each file
clicks
| Fields | Meaning |
|---|---|
click_id / clicked_at | Id and time (UTC) of the click. |
link_id / link_slug | The link, when the address was one. Null for the project root or a passthrough path. |
host / path | What was requested. |
outcome | What happened: app_opened, redirect_app_store, web_fallback, … |
traffic_class / is_unique / is_qr | human, bot or scanner; first click from this visitor on this link in the hour; came from a QR code. |
os / os_version / device_class / browser / in_app | The visitor's device. in_app names the in-app browser (instagram, …). |
country / region / city | Coarse location. No IP address is ever exported. |
referrer_host / utm_* | Where the click came from and its campaign tags. |
rule_id / variant_id / referrer | Targeting rule and A/B variant served; who shared the link (referral links). |
installs
| Fields | Meaning |
|---|---|
install_id / installed_at | The SDK's id for the install and its first open. |
platform / os_version / app_version / sdk_version | What was installed. |
matched / match_method / match_confidence | Whether the first open was tied to a click, how (install_referrer, clipboard, fingerprint) and how surely. |
click_id / link_id / referrer | The click it was matched to, its link, and who shared that link. |
opens
| Fields | Meaning |
|---|---|
open_id / opened_at | Id and time of the open. |
install_id / link_id / link_slug | The install that opened and the link that opened it. |
source / is_first_open | universal_link, app_link, uri_scheme, deferred or web; true right after an install. |
referrer | Who shared the link. |
events
| Fields | Meaning |
|---|---|
event_id / occurred_at / name | The in-app event your app reported. |
value / currency / props | Amount as a decimal string, ISO currency, and the properties sent. |
install_id / click_id / link_id / referrer | The install that sent it, and the click, link and sharer it was attributed to. |
No IP address or visitor fingerprint is ever in a file. New fields can be added; ignore ones you do not know.
Limits
- Daily files, not a stream. For events as they happen, use webhooks.
- Any of the last 400 days can be downloaded, but days older than the plan’s click-by-click history may have no rows left.
- Endpoints must be
httpsand may not point at private network addresses.