01Jobs it does
Each one is a real command line. Copy it, or open it in the builder below to change it.
app installs report
Also: skadnetwork postbacks
p202 app report02What you get
--json, --csv or --ndjson for scripts, or -q for ids only. An AI agent gets compact JSON without asking. All output formats03Build your command
Pick values and the command line writes itself, quoted and ready to paste.
p202 app reportSet flags below; the command updates as you type.
04Flags
30 flags, plus the global flags every command takes.
| Flag | What it does |
|---|---|
| --ad-interaction-typestring | Filter: view (view-through) or click: view, clickviewclick |
| --ad-network-idstring | Filter by ad network id |
| --aff-campaign-idstring | Android: only installs on this campaign's clicks (p202 campaign list) |
| --app-idstring | Filter by the App Store id the postback itself named (forensic; prefer --registration-id) |
| --campaign-idstring | Filter by SKAN 2/3 campaign id |
| --coarse-conversion-valuestring | Filter by coarse value: low, medium, highlowmediumhigh |
| --conversion-typestring | Filter by conversion type: download, redownload, re-engagementdownloadredownloadre-engagement |
| --country-codestring | Filter by install country code |
| --ctit-flagstring | Android: only installs whose click-to-install time is: short, ok, long, unmeasuredshortoklongunmeasured |
| --did-winstring | Filter: 1=winning postbacks, 0=losing: 0, 1 (aliases: false=0, true=1)01false → 0true → 1 |
| --fast-goalsstring | Android: only installs with a goal reached implausibly fast (1), or only those without one (0): 0, 101 |
| --fidelity-typestring | Filter: 1=click-through, 0=view-through (both protocols; prefer --ad-interaction-type): 0, 101 |
| --group-bystring · default day | Group by (ad-network, source, country, version, protocol, conversion-type need --platform ios; campaign, match-state, integrity-state, ctit-flag, goal need --platform android): day, registration, platform, ad-network, source, country, version, protocol, conversion-type, campaign, match-state, integrity-state, ctit-flag, goaldayregistrationplatformad-networksourcecountryversionprotocolconversion-typecampaignmatch-stateintegrity-statectit-flaggoal |
| --integrity-statestring | Android: only installs whose Play Integrity verdict is in this state: not_requested, received, missing, pending, valid, invalid, error, skippednot_requestedreceivedmissingpendingvalidinvaliderrorskipped |
| --limit, -lstring | Max groups per platform (default 100) |
| --match-statestring | Android: only installs in this match state: attributed, organic, third_party, unavailable, pending_click, bad_token, foreign_click, implausible, outside_window, duplicate_click, pending_integrity, integrity_failed, integrity_unverifiedattributedorganicthird_partyunavailablepending_clickbad_tokenforeign_clickimplausibleoutside_windowduplicate_clickpending_integrityintegrity_failedintegrity_unverified |
| --platformstring | Platform (default ios; all reports both): ios, android, alliosandroidall |
| --postback-sequence-indexstring | Filter by conversion window: 0, 1, 2012 |
| --protocolstring | Filter by protocol: skadnetwork, adattributionkit (aliases: aak=adattributionkit, skan=skadnetwork)skadnetworkadattributionkitaak → adattributionkitskan → skadnetwork |
| --redownloadstring | Filter: 1=redownloads, 0=first installs (both protocols; prefer --conversion-type): 0, 1 (aliases: false=0, true=1)01false → 0true → 1 |
| --registration-idstring | Filter by registration (from p202 app list) |
| --registration-idsstring | Filter by several registrations, comma-separated |
| --signaturestring | Filter by verification state: valid, invalid, unverifiable, developmentvalidinvalidunverifiabledevelopment |
| --source-identifierstring | Filter by SKAN 4 source identifier |
| --teststring | Android: only test installs (1) or only real ones (0): 0, 101 |
| --time-fromstring | Received-at range start (unix timestamp) |
| --time-tostring | Received-at range end (unix timestamp) |
| --transaction-idstring | Filter by Apple transaction id |
| --trustedstring | Android: only this trust class (trusted, refuted, unvouched); goals are then counted over ittrustedrefutedunvouched |
| --versionstring | Filter by SKAN postback version (e.g. 4.0) |
05How it works
Reports Apple's postbacks by default (--platform ios, what this report meant before Android),
Android installs with --platform android, and both with --platform all. Any platform groups by
day (UTC), registration or platform; iOS also by ad-network, source, country, version, protocol
or conversion-type (Apple's postbacks, decoded through p202 app encoding), Android also by
campaign, match-state, integrity-state, ctit-flag (click-to-install time: short, ok, long,
unmeasured) or goal (the funnel: installs that reached each goal).
Every row carries platform, installs, the trust-class counts, goals_reached, revenue and events. Headline figures count trusted signals only: signature-verified postbacks, attributed installs. --signature (iOS) or --trusted (Android) recompute them over one class. Totals are in meta.totals: per platform, and with both platforms {ios, android, combined}. Android figures are by install: a goal counts in its install's group.
06For agents
Running this from an agent
- Read the same facts as JSON:
p202 commands app report --json. - With
AI_AGENT,CLAUDECODEor another agent variable set, output is compact JSON and errors arrive on stderr as a JSON envelope with ahint. - Exit codes: 0 ok, 1 bad input, 2 auth, 3 network, 4 server error, 5 partial failure.
{
"path": "p202 app report",
"use": "report",
"short": "Cross-platform app report: iOS postbacks and Android installs, with the goals they reached",
"long": "Reports Apple's postbacks by default (--platform ios, what this report meant before Android),\nAndroid installs with --platform android, and both with --platform all. Any platform groups by\nday (UTC), registration or platform; iOS also by ad-network, source, country, version, protocol\nor conversion-type (Apple's postbacks, decoded through `p202 app encoding`), Android also by\ncampaign, match-state, integrity-state, ctit-flag (click-to-install time: short, ok, long,\nunmeasured) or goal (the funnel: installs that reached each goal).\n\nEvery row carries platform, installs, the trust-class counts, goals_reached, revenue and\nevents. Headline figures count trusted signals only: signature-verified postbacks, attributed\ninstalls. --signature (iOS) or --trusted (Android) recompute them over one class.\nTotals are in meta.totals: per platform, and with both platforms {ios, android, combined}.\nAndroid figures are by install: a goal counts in its install's group.",
"runnable": true,
"example": "p202 app report --platform all --group-by registration\n p202 app report --platform android --group-by goal --registration-id 7\n p202 app report --platform ios --group-by ad-network --signature valid",
"tasks": [
{
"run": "p202 app report",
"ui_pages": [
"Analyze › Mobile Apps"
],
"phrases": [
"app installs report",
"skadnetwork postbacks"
]
}
],
"flags": [
{
"name": "ad-interaction-type",
"type": "string",
"default": "",
"usage": "Filter: view (view-through) or click: view, click",
"allowed_values": [
"view",
"click"
],
"required": false
},
{
"name": "ad-network-id",
"type": "string",
"default": "",
"usage": "Filter by ad network id",
"required": false
},
{
"name": "aff-campaign-id",
"type": "string",
"default": "",
"usage": "Android: only installs on this campaign's clicks (`p202 campaign list`)",
"required": false
},
{
"name": "app-id",
"type": "string",
"default": "",
"usage": "Filter by the App Store id the postback itself named (forensic; prefer --registration-id)",
"required": false
},
{
"name": "campaign-id",
"type": "string",
"default": "",
"usage": "Filter by SKAN 2/3 campaign id",
"required": false
},
{
"name": "coarse-conversion-value",
"type": "string",
"default": "",
"usage": "Filter by coarse value: low, medium, high",
"allowed_values": [
"low",
"medium",
"high"
],
"required": false
},
{
"name": "conversion-type",
"type": "string",
"default": "",
"usage": "Filter by conversion type: download, redownload, re-engagement",
"allowed_values": [
"download",
"redownload",
"re-engagement"
],
"required": false
},
{
"name": "country-code",
"type": "string",
"default": "",
"usage": "Filter by install country code",
"required": false
},
{
"name": "ctit-flag",
"type": "string",
"default": "",
"usage": "Android: only installs whose click-to-install time is: short, ok, long, unmeasured",
"allowed_values": [
"short",
"ok",
"long",
"unmeasured"
],
"required": false
},
{
"name": "did-win",
"type": "string",
"default": "",
"usage": "Filter: 1=winning postbacks, 0=losing: 0, 1 (aliases: false=0, true=1)",
"allowed_values": [
"0",
"1"
],
"value_aliases": {
"false": "0",
"true": "1"
},
"required": false
},
{
"name": "fast-goals",
"type": "string",
"default": "",
"usage": "Android: only installs with a goal reached implausibly fast (1), or only those without one (0): 0, 1",
"allowed_values": [
"0",
"1"
],
"required": false
},
{
"name": "fidelity-type",
"type": "string",
"default": "",
"usage": "Filter: 1=click-through, 0=view-through (both protocols; prefer --ad-interaction-type): 0, 1",
"allowed_values": [
"0",
"1"
],
"required": false
},
{
"name": "group-by",
"type": "string",
"default": "day",
"usage": "Group by (ad-network, source, country, version, protocol, conversion-type need --platform ios; campaign, match-state, integrity-state, ctit-flag, goal need --platform android): day, registration, platform, ad-network, source, country, version, protocol, conversion-type, campaign, match-state, integrity-state, ctit-flag, goal",
"allowed_values": [
"day",
"registration",
"platform",
"ad-network",
"source",
"country",
"version",
"protocol",
"conversion-type",
"campaign",
"match-state",
"integrity-state",
"ctit-flag",
"goal"
],
"required": false
},
{
"name": "integrity-state",
"type": "string",
"default": "",
"usage": "Android: only installs whose Play Integrity verdict is in this state: not_requested, received, missing, pending, valid, invalid, error, skipped",
"allowed_values": [
"not_requested",
"received",
"missing",
"pending",
"valid",
"invalid",
"error",
"skipped"
],
"required": false
},
{
"name": "limit",
"shorthand": "l",
"type": "string",
"default": "",
"usage": "Max groups per platform (default 100)",
"required": false
},
{
"name": "match-state",
"type": "string",
"default": "",
"usage": "Android: only installs in this match state: attributed, organic, third_party, unavailable, pending_click, bad_token, foreign_click, implausible, outside_window, duplicate_click, pending_integrity, integrity_failed, integrity_unverified",
"allowed_values": [
"attributed",
"organic",
"third_party",
"unavailable",
"pending_click",
"bad_token",
"foreign_click",
"implausible",
"outside_window",
"duplicate_click",
"pending_integrity",
"integrity_failed",
"integrity_unverified"
],
"required": false
},
{
"name": "platform",
"type": "string",
"default": "",
"usage": "Platform (default ios; all reports both): ios, android, all",
"allowed_values": [
"ios",
"android",
"all"
],
"required": false
},
{
"name": "postback-sequence-index",
"type": "string",
"default": "",
"usage": "Filter by conversion window: 0, 1, 2",
"allowed_values": [
"0",
"1",
"2"
],
"required": false
},
{
"name": "protocol",
"type": "string",
"default": "",
"usage": "Filter by protocol: skadnetwork, adattributionkit (aliases: aak=adattributionkit, skan=skadnetwork)",
"allowed_values": [
"skadnetwork",
"adattributionkit"
],
"value_aliases": {
"aak": "adattributionkit",
"skan": "skadnetwork"
},
"required": false
},
{
"name": "redownload",
"type": "string",
"default": "",
"usage": "Filter: 1=redownloads, 0=first installs (both protocols; prefer --conversion-type): 0, 1 (aliases: false=0, true=1)",
"allowed_values": [
"0",
"1"
],
"value_aliases": {
"false": "0",
"true": "1"
},
"required": false
},
{
"name": "registration-id",
"type": "string",
"default": "",
"usage": "Filter by registration (from `p202 app list`)",
"required": false
},
{
"name": "registration-ids",
"type": "string",
"default": "",
"usage": "Filter by several registrations, comma-separated",
"required": false
},
{
"name": "signature",
"type": "string",
"default": "",
"usage": "Filter by verification state: valid, invalid, unverifiable, development",
"allowed_values": [
"valid",
"invalid",
"unverifiable",
"development"
],
"required": false
},
{
"name": "source-identifier",
"type": "string",
"default": "",
"usage": "Filter by SKAN 4 source identifier",
"required": false
},
{
"name": "test",
"type": "string",
"default": "",
"usage": "Android: only test installs (1) or only real ones (0): 0, 1",
"allowed_values": [
"0",
"1"
],
"required": false
},
{
"name": "time-from",
"type": "string",
"default": "",
"usage": "Received-at range start (unix timestamp)",
"required": false
},
{
"name": "time-to",
"type": "string",
"default": "",
"usage": "Received-at range end (unix timestamp)",
"required": false
},
{
"name": "transaction-id",
"type": "string",
"default": "",
"usage": "Filter by Apple transaction id",
"required": false
},
{
"name": "trusted",
"type": "string",
"default": "",
"usage": "Android: only this trust class (trusted, refuted, unvouched); goals are then counted over it",
"allowed_values": [
"trusted",
"refuted",
"unvouched"
],
"required": false
},
{
"name": "version",
"type": "string",
"default": "",
"usage": "Filter by SKAN postback version (e.g. 4.0)",
"required": false
}
]
}