Help us shape the future of Go! Take the 2026 Go Developer Survey

appsflyer-cli

module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 18, 2026 License: MIT

README

afcli — AppsFlyer CLI

An unofficial command-line client for the AppsFlyer reporting APIs, written in Go.

Fetch raw data, aggregate data, and Master API reports straight from your terminal — no dashboard clicking, easy to pipe into jq, csvkit, or your data pipeline.

Note: This project is not affiliated with or endorsed by AppsFlyer.

Supported APIs

Command API Endpoint
afcli raw Pull API raw data /api/raw-data/export/app/{app-id}/{report}/v5
afcli agg Pull API aggregate data /api/agg-data/export/app/{app-id}/{report}/v5
afcli master Master API /api/master-agg-data/v4/app/{app-id}
afcli cohort Cohort API /api/cohorts/v1/data/app/{app-id}
afcli skan SKAN aggregated performance report /api/skadnetworks/{v2,v3}/data/app/{app-id}
afcli freshness Master Freshness API /api/master-agg-data/lastupdate
afcli onelink OneLink API v2.0 onelink.appsflyer.com/api/v2.0/shortlinks/...

Installation

go install github.com/rie03p/appsflyer-cli/cmd/afcli@latest

Or download a prebuilt binary from the releases page, or build from source:

git clone https://github.com/rie03p/appsflyer-cli.git
cd appsflyer-cli
go build -o afcli ./cmd/afcli

Authentication

All requests use an AppsFlyer API V2 token (Bearer token). An account admin can retrieve it from the AppsFlyer dashboard under Settings → API tokens.

Store it once with auth login (recommended):

afcli auth login   # prompts for the token, hidden input
afcli auth status  # shows which token is in use
afcli auth logout  # deletes the stored token

The token is saved to your user config directory with 0600 permissions. Alternatively, set the APPSFLYER_API_TOKEN environment variable or pass --token on any command; precedence is --token > APPSFLYER_API_TOKEN > stored token.

The OneLink API uses a separate token (ask your CSM or dashboard admin). Store it with afcli auth login --onelink, or use ONELINK_API_TOKEN / --onelink-token.

Usage

Every command documents its flags, defaults, and API limits — run afcli <command> --help. A quick tour:

# Raw installs for the first week of July (afcli raw list shows all 20+ report names)
afcli raw installs_report --app id123456789 --from 2026-07-01 --to 2026-07-07

# Purchases from Japan, saved to a file
afcli raw in_app_events_report --app id123456789 --from 2026-07-01 --to 2026-07-07 \
  --event-name af_purchase --geo JP -o purchases.csv

# Aggregate partner performance (afcli agg list shows all report names)
afcli agg partners_report --app id123456789 --from 2026-07-01 --to 2026-07-07

# Cross-app KPIs with a calculated CTR, as JSON
afcli master --app all --from 2026-07-01 --to 2026-07-07 \
  --groupings app_id,pid --kpis installs,clicks,impressions \
  --filter pid=facebook --calculated-kpi ctr=clicks/impressions --format json

# Cumulative ROAS cohorts by media source and country
afcli cohort --app id123456789 --from 2026-06-01 --to 2026-06-30 \
  --cohort-type user_acquisition --kpis users,roas --groupings pid,geo \
  --aggregation-type cumulative

# iOS SKAdNetwork performance (SKAN 4 by default)
afcli skan --app id123456789 --start-date 2026-07-01 --end-date 2026-07-07

# When was aggregated data last updated?
afcli freshness

# OneLink short links: create, inspect, update, delete
afcli onelink create abc123 --param pid=email --param c=summer_sale --ttl 90d
afcli onelink get abc123 qwer9876
afcli onelink delete abc123 qwer9876

Global flags on every report command: -o/--output (write to a file), --token, --timeout, --base-url.

Development

go build -o afcli ./cmd/afcli
go test ./...
go vet ./...

The API client lives in internal/appsflyer (one file per API family, no CLI dependencies) and is independent of the command tree in internal/cli (one file per command); both are covered by tests against httptest servers. To support a new AppsFlyer API, add a client file and a matching command file.

main is the only long-lived branch (GitHub Flow): topic branches merge into it via PR once CI passes, and releases are cut by pushing a semver tag (vX.Y.Z), which triggers goreleaser to publish cross-platform binaries to GitHub Releases. Commit messages follow Conventional Commits — release notes are generated from them.

License

MIT

Directories

Path Synopsis
cmd
afcli command
internal
appsflyer
Package appsflyer provides a client for the AppsFlyer reporting APIs (Pull API raw data, Pull API aggregate data, and Master API).
Package appsflyer provides a client for the AppsFlyer reporting APIs (Pull API raw data, Pull API aggregate data, and Master API).
cli
Package cli implements the afcli command tree.
Package cli implements the afcli command tree.
config
Package config persists CLI settings under the user config directory.
Package config persists CLI settings under the user config directory.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL