01Run it
Straight from the command's own help.
p202 rotator stats 3 --period last30p202 rotator stats 3 --period yesterday --show real02What you get
Captured from the real binary, run against a demo store with 30 days of traffic. Switch tabs to see the same run as JSON, the shape scripts and agents parse.
$ p202 rotator stats 1 --period last30 default: {"avg_cpc":0,"conv_rate":0,"cpa":0,"epc":0,"roi":0,"total_click_throughs":0,"total_clicks":0,"total_cost":0,"total_income":0,"total_leads":0,"total_net":0} rotator: {"id":1,"name":"SaaS pricing geo split"} rules: [{"avg_cpc":0,"conv_rate":0,"cpa":0,"deleted":false,"epc":0,"roi":0,"rule_id":1,"rule_name":"Canada to the trial offer","status":1,"total_click_throughs":0,"total_clicks":0,"total_cost":0,"total_income":0,"total_leads":0,"total_net":0}] totals: {"avg_cpc":0,"conv_rate":0,"cpa":0,"epc":0,"roi":0,"total_click_throughs":0,"total_clicks":0,"total_cost":0,"total_income":0,"total_leads":0,"total_net":0}
$ p202 rotator stats 1 --period last30 --json { "data": { "default": { "avg_cpc": 0, "conv_rate": 0, "cpa": 0, "epc": 0, "roi": 0, "total_click_throughs": 0, "total_clicks": 0, "total_cost": 0, "total_income": 0, "total_leads": 0, "total_net": 0 }, "rotator": { "id": 1, "name": "SaaS pricing geo split" }, "rules": [ { "avg_cpc": 0, "conv_rate": 0, "cpa": 0, "deleted": false, "epc": 0, "roi": 0, "rule_id": 1, "rule_name": "Canada to the trial offer", "status": 1, "total_click_throughs": 0, "total_clicks": 0, "total_cost": 0, "total_income": 0, "total_leads": 0, "total_net": 0 } ], "totals": { "avg_cpc": 0, "conv_rate": 0, "cpa": 0, "epc": 0, "roi": 0, "total_click_throughs": 0, "total_clicks": 0, "total_cost": 0, "total_income": 0, "total_leads": 0, "total_net": 0 } } }
03Build your command
Pick values and the command line writes itself, quoted and ready to paste.
p202 rotator statsSet flags below; the command updates as you type.
04Flags
20 flags, plus the global flags every command takes.
| Flag | What it does |
|---|---|
| --aff-campaign-idstring | Filter by INTERNAL campaign id (from campaign list), not the public id in tracking URLs |
| --aff-network-idstring | Filter by affiliate network ID |
| --browser-idstring | Filter by browser ID (the id of a --breakdown browser row) |
| --country-idstring | Filter by country ID |
| --device-typestring | Filter by device type ID: 1 Desktop, 2 Mobile, 3 Tablet, 4 Bot (the ids of --breakdown device_type rows) |
| --ipstring | Only clicks from this one IP address, IPv4 or IPv6 |
| --isp-idstring | Filter by ISP/carrier ID (the id of a --breakdown isp row) |
| --keywordstring | Only clicks whose keyword contains this text (case-insensitive) |
| --landing-page-idstring | Filter by landing page ID |
| --method-of-promotionstring | Only direct-link clicks or only landing-page clicks: directlink, landingpagedirectlinklandingpage |
| --period, -pstring | Period: today, yesterday, last7, last14, last30, last90, thismonth, lastmonth, thisyear, lastyear, alltimetodayyesterdaylast7last14last30last90thismonthlastmonththisyearlastyearalltime |
| --platform-idstring | Filter by platform (OS) ID (the id of a --breakdown platform row) |
| --ppc-account-idstring | Filter by PPC account ID |
| --ppc-network-idstring | Filter by PPC network ID, or none for the clicks with no traffic source |
| --refererstring | Only clicks whose referring URL contains this text (case-insensitive) |
| --region-idstring | Filter by region ID (the id of a --breakdown region row) |
| --showstring | Which clicks count (default all): all, real, filtered, filtered_bot, leads; real = not filtered, filtered_bot = filtered as bots, leads = convertedallrealfilteredfiltered_botleads |
| --text-ad-idstring | Filter by text ad ID |
| --time-fromstring | Start: unix seconds, a date (2026-10-01, from its first second in the account's timezone) or a time with its offset (2026-10-01T09:30:00Z) |
| --time-tostring | End, inclusive: unix seconds, a date (2026-10-01, through its last second in the account's timezone) or a time with its offset |
05How it works
The Overview's Rotator Breakdown for one rotator, from GET /rotators/{id}/stats: clicks, leads, income, cost, net, EPC, conversion rate and ROI for the rotator, for each of its rules (the rule the click matched), and for its default. The rules and the default add up to the totals; a rule since deleted that still has clicks in the window is listed with deleted: true. Takes the window and the filters every report takes. Needs a key with read scope on rotators and reports.
06For agents
Running this from an agent
- Read the same facts as JSON:
p202 commands rotator stats --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 rotator stats",
"use": "stats <id>",
"short": "Show a rotator's performance: its totals, each rule, and its default (clicks no rule matched)",
"long": "The Overview's Rotator Breakdown for one rotator, from GET /rotators/{id}/stats: clicks, leads, income,\ncost, net, EPC, conversion rate and ROI for the rotator, for each of its rules (the rule the click matched),\nand for its default. The rules and the default add up to the totals; a rule since deleted that still has\nclicks in the window is listed with deleted: true. Takes the window and the filters every report takes.\nNeeds a key with read scope on rotators and reports.",
"runnable": true,
"example": "p202 rotator stats 3 --period last30\n p202 rotator stats 3 --period yesterday --show real",
"flags": [
{
"name": "aff-campaign-id",
"type": "string",
"default": "",
"usage": "Filter by INTERNAL campaign id (from `campaign list`), not the public id in tracking URLs",
"required": false
},
{
"name": "aff-network-id",
"type": "string",
"default": "",
"usage": "Filter by affiliate network ID",
"required": false
},
{
"name": "browser-id",
"type": "string",
"default": "",
"usage": "Filter by browser ID (the id of a `--breakdown browser` row)",
"required": false
},
{
"name": "country-id",
"type": "string",
"default": "",
"usage": "Filter by country ID",
"required": false
},
{
"name": "device-type",
"type": "string",
"default": "",
"usage": "Filter by device type ID: 1 Desktop, 2 Mobile, 3 Tablet, 4 Bot (the ids of `--breakdown device_type` rows)",
"required": false
},
{
"name": "ip",
"type": "string",
"default": "",
"usage": "Only clicks from this one IP address, IPv4 or IPv6",
"required": false
},
{
"name": "isp-id",
"type": "string",
"default": "",
"usage": "Filter by ISP/carrier ID (the id of a `--breakdown isp` row)",
"required": false
},
{
"name": "keyword",
"type": "string",
"default": "",
"usage": "Only clicks whose keyword contains this text (case-insensitive)",
"required": false
},
{
"name": "landing-page-id",
"type": "string",
"default": "",
"usage": "Filter by landing page ID",
"required": false
},
{
"name": "method-of-promotion",
"type": "string",
"default": "",
"usage": "Only direct-link clicks or only landing-page clicks: directlink, landingpage",
"allowed_values": [
"directlink",
"landingpage"
],
"required": false
},
{
"name": "period",
"shorthand": "p",
"type": "string",
"default": "",
"usage": "Period: today, yesterday, last7, last14, last30, last90, thismonth, lastmonth, thisyear, lastyear, alltime",
"allowed_values": [
"today",
"yesterday",
"last7",
"last14",
"last30",
"last90",
"thismonth",
"lastmonth",
"thisyear",
"lastyear",
"alltime"
],
"required": false
},
{
"name": "platform-id",
"type": "string",
"default": "",
"usage": "Filter by platform (OS) ID (the id of a `--breakdown platform` row)",
"required": false
},
{
"name": "ppc-account-id",
"type": "string",
"default": "",
"usage": "Filter by PPC account ID",
"required": false
},
{
"name": "ppc-network-id",
"type": "string",
"default": "",
"usage": "Filter by PPC network ID, or none for the clicks with no traffic source",
"required": false
},
{
"name": "referer",
"type": "string",
"default": "",
"usage": "Only clicks whose referring URL contains this text (case-insensitive)",
"required": false
},
{
"name": "region-id",
"type": "string",
"default": "",
"usage": "Filter by region ID (the id of a `--breakdown region` row)",
"required": false
},
{
"name": "show",
"type": "string",
"default": "",
"usage": "Which clicks count (default all): all, real, filtered, filtered_bot, leads; real = not filtered, filtered_bot = filtered as bots, leads = converted",
"allowed_values": [
"all",
"real",
"filtered",
"filtered_bot",
"leads"
],
"required": false
},
{
"name": "text-ad-id",
"type": "string",
"default": "",
"usage": "Filter by text ad ID",
"required": false
},
{
"name": "time-from",
"type": "string",
"default": "",
"usage": "Start: unix seconds, a date (2026-10-01, from its first second in the account's timezone) or a time with its offset (2026-10-01T09:30:00Z)",
"required": false
},
{
"name": "time-to",
"type": "string",
"default": "",
"usage": "End, inclusive: unix seconds, a date (2026-10-01, through its last second in the account's timezone) or a time with its offset",
"required": false
}
]
}