Skip to content
DL2App
Documentation menu

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.

  1. 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.
  2. Enter the endpoint, region, bucket, an optional folder and the key. The secret is stored encrypted.
  3. 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.gz

The dt= folders are the date-partition layout that Athena, BigQuery and Snowflake read directly. Times are UTC.

What is in each file

clicks

FieldsMeaning
click_id / clicked_atId and time (UTC) of the click.
link_id / link_slugThe link, when the address was one. Null for the project root or a passthrough path.
host / pathWhat was requested.
outcomeWhat happened: app_opened, redirect_app_store, web_fallback, …
traffic_class / is_unique / is_qrhuman, 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_appThe visitor's device. in_app names the in-app browser (instagram, …).
country / region / cityCoarse location. No IP address is ever exported.
referrer_host / utm_*Where the click came from and its campaign tags.
rule_id / variant_id / referrerTargeting rule and A/B variant served; who shared the link (referral links).

installs

FieldsMeaning
install_id / installed_atThe SDK's id for the install and its first open.
platform / os_version / app_version / sdk_versionWhat was installed.
matched / match_method / match_confidenceWhether the first open was tied to a click, how (install_referrer, clipboard, fingerprint) and how surely.
click_id / link_id / referrerThe click it was matched to, its link, and who shared that link.

opens

FieldsMeaning
open_id / opened_atId and time of the open.
install_id / link_id / link_slugThe install that opened and the link that opened it.
source / is_first_openuniversal_link, app_link, uri_scheme, deferred or web; true right after an install.
referrerWho shared the link.

events

FieldsMeaning
event_id / occurred_at / nameThe in-app event your app reported.
value / currency / propsAmount as a decimal string, ISO currency, and the properties sent.
install_id / click_id / link_id / referrerThe 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 https and may not point at private network addresses.