adapty 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2691,56 +2691,6 @@
2691
2691
  "list.js"
2692
2692
  ]
2693
2693
  },
2694
- "asa:apps:list": {
2695
- "aliases": [],
2696
- "args": {},
2697
- "description": "List the apps promoted by this company in Apple Search Ads",
2698
- "examples": [
2699
- "<%= config.bin %> asa apps list",
2700
- "<%= config.bin %> asa apps list --page 2 --page-size 50"
2701
- ],
2702
- "flags": {
2703
- "json": {
2704
- "description": "Format output as json.",
2705
- "helpGroup": "GLOBAL",
2706
- "name": "json",
2707
- "allowNo": false,
2708
- "type": "boolean"
2709
- },
2710
- "page": {
2711
- "description": "Page number",
2712
- "name": "page",
2713
- "default": 1,
2714
- "hasDynamicHelp": false,
2715
- "multiple": false,
2716
- "type": "option"
2717
- },
2718
- "page-size": {
2719
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2720
- "name": "page-size",
2721
- "default": 100,
2722
- "hasDynamicHelp": false,
2723
- "multiple": false,
2724
- "type": "option"
2725
- }
2726
- },
2727
- "hasDynamicHelp": false,
2728
- "hiddenAliases": [],
2729
- "id": "asa:apps:list",
2730
- "pluginAlias": "adapty",
2731
- "pluginName": "adapty",
2732
- "pluginType": "core",
2733
- "strict": true,
2734
- "enableJsonFlag": true,
2735
- "isESM": true,
2736
- "relativePath": [
2737
- "dist",
2738
- "commands",
2739
- "asa",
2740
- "apps",
2741
- "list.js"
2742
- ]
2743
- },
2744
2694
  "asa:ad-groups:create": {
2745
2695
  "aliases": [],
2746
2696
  "args": {},
@@ -3122,15 +3072,12 @@
3122
3072
  "update.js"
3123
3073
  ]
3124
3074
  },
3125
- "asa:automations:create": {
3075
+ "asa:ads:create": {
3126
3076
  "aliases": [],
3127
3077
  "args": {},
3128
- "description": "Create an automation rule from a JSON rule file. The add-as-keyword action flags fill in or override actions[0].params, so the bid, the match type and the target ad groups need no hand-written JSON.",
3078
+ "description": "Create an ad from a creative in an ad group",
3129
3079
  "examples": [
3130
- "<%= config.bin %> asa automations create --file rule.json",
3131
- "<%= config.bin %> asa automations create --file rule.json --run-now",
3132
- "<%= config.bin %> asa automations create --file rule.json --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type search_term_current_cpt",
3133
- "<%= config.bin %> asa automations create --file rule.json --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type set_to --cpt-bid 1.50 --negate ad-group"
3080
+ "<%= config.bin %> asa ads create --ad-group UUID --creative-id 4321 --name \"Summer ad\""
3134
3081
  ],
3135
3082
  "flags": {
3136
3083
  "json": {
@@ -3140,111 +3087,59 @@
3140
3087
  "allowNo": false,
3141
3088
  "type": "boolean"
3142
3089
  },
3143
- "cpt-bid": {
3144
- "description": "cpt_bid.value: the bid itself with --cpt-bid-type set_to, or a percent markup on the entity bid with search_term_current_cpt / keyword_current_bid; not accepted with ad_group_default_bid",
3145
- "name": "cpt-bid",
3146
- "hasDynamicHelp": false,
3147
- "multiple": false,
3148
- "type": "option"
3090
+ "yes": {
3091
+ "char": "y",
3092
+ "description": "Apply without asking; required when the output is piped or --json is used",
3093
+ "name": "yes",
3094
+ "allowNo": false,
3095
+ "type": "boolean"
3149
3096
  },
3150
- "cpt-bid-type": {
3151
- "description": "Where the bid of the created keyword comes from; the API has no default",
3152
- "name": "cpt-bid-type",
3097
+ "idempotency-key": {
3098
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3099
+ "name": "idempotency-key",
3153
3100
  "hasDynamicHelp": false,
3154
3101
  "multiple": false,
3155
- "options": [
3156
- "ad_group_default_bid",
3157
- "keyword_current_bid",
3158
- "search_term_current_cpt",
3159
- "set_to"
3160
- ],
3161
3102
  "type": "option"
3162
3103
  },
3163
- "match-type": {
3164
- "description": "Match type of the created keyword; the API has no default",
3165
- "name": "match-type",
3104
+ "ad-group": {
3105
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
3106
+ "name": "ad-group",
3107
+ "required": true,
3166
3108
  "hasDynamicHelp": false,
3167
3109
  "multiple": false,
3168
- "options": [
3169
- "BROAD",
3170
- "EXACT"
3171
- ],
3172
3110
  "type": "option"
3173
3111
  },
3174
- "negate": {
3175
- "description": "Also add the search term as a negative keyword at this level (search-term rules)",
3176
- "exclusive": [
3177
- "no-negate"
3178
- ],
3179
- "name": "negate",
3112
+ "creative-id": {
3113
+ "description": "Apple creative ID from a product page or the default set",
3114
+ "name": "creative-id",
3115
+ "required": true,
3180
3116
  "hasDynamicHelp": false,
3181
3117
  "multiple": false,
3182
- "options": [
3183
- "ad-group",
3184
- "campaign"
3185
- ],
3186
- "type": "option"
3187
- },
3188
- "no-negate": {
3189
- "description": "Leave no negative keyword behind (search-term rules)",
3190
- "exclusive": [
3191
- "negate"
3192
- ],
3193
- "name": "no-negate",
3194
- "allowNo": false,
3195
- "type": "boolean"
3196
- },
3197
- "pause-original": {
3198
- "description": "Pause the source keyword in its own ad group (targeting-keyword rules)",
3199
- "name": "pause-original",
3200
- "allowNo": true,
3201
- "type": "boolean"
3202
- },
3203
- "skip-enable-duplicates": {
3204
- "description": "Skip a keyword that already exists in the target ad group instead of enabling it (search-term rules)",
3205
- "name": "skip-enable-duplicates",
3206
- "allowNo": true,
3207
- "type": "boolean"
3208
- },
3209
- "target-ad-group": {
3210
- "description": "Ad group the keyword is added to (UUID), repeatable; a rule without one does nothing",
3211
- "name": "target-ad-group",
3212
- "hasDynamicHelp": false,
3213
- "multiple": true,
3214
3118
  "type": "option"
3215
3119
  },
3216
- "yes": {
3217
- "char": "y",
3218
- "description": "Apply without asking; required when the output is piped or --json is used",
3219
- "name": "yes",
3220
- "allowNo": false,
3221
- "type": "boolean"
3222
- },
3223
- "idempotency-key": {
3224
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3225
- "name": "idempotency-key",
3120
+ "name": {
3121
+ "description": "Ad name",
3122
+ "name": "name",
3123
+ "required": true,
3226
3124
  "hasDynamicHelp": false,
3227
3125
  "multiple": false,
3228
3126
  "type": "option"
3229
3127
  },
3230
- "file": {
3231
- "description": "JSON file with the rule body, or - to read stdin",
3232
- "name": "file",
3233
- "required": true,
3128
+ "status": {
3129
+ "description": "Initial status",
3130
+ "name": "status",
3234
3131
  "hasDynamicHelp": false,
3235
3132
  "multiple": false,
3133
+ "options": [
3134
+ "ENABLED",
3135
+ "PAUSED"
3136
+ ],
3236
3137
  "type": "option"
3237
- },
3238
- "run-now": {
3239
- "description": "Queue the first run right after the rule is stored",
3240
- "name": "run-now",
3241
- "allowNo": false,
3242
- "type": "boolean"
3243
3138
  }
3244
3139
  },
3245
3140
  "hasDynamicHelp": false,
3246
3141
  "hiddenAliases": [],
3247
- "id": "asa:automations:create",
3142
+ "id": "asa:ads:create",
3248
3143
  "pluginAlias": "adapty",
3249
3144
  "pluginName": "adapty",
3250
3145
  "pluginType": "core",
@@ -3255,22 +3150,22 @@
3255
3150
  "dist",
3256
3151
  "commands",
3257
3152
  "asa",
3258
- "automations",
3153
+ "ads",
3259
3154
  "create.js"
3260
3155
  ]
3261
3156
  },
3262
- "asa:automations:get": {
3157
+ "asa:ads:get": {
3263
3158
  "aliases": [],
3264
3159
  "args": {
3265
- "automation_id": {
3266
- "description": "Automation rule ID (UUID)",
3267
- "name": "automation_id",
3160
+ "ad_id": {
3161
+ "description": "Ad ID (UUID)",
3162
+ "name": "ad_id",
3268
3163
  "required": true
3269
3164
  }
3270
3165
  },
3271
- "description": "Show one automation rule with its conditions and actions",
3166
+ "description": "Show one ad and its serving state",
3272
3167
  "examples": [
3273
- "<%= config.bin %> asa automations get 550e8400-e29b-41d4-a716-446655440000"
3168
+ "<%= config.bin %> asa ads get 550e8400-e29b-41d4-a716-446655440000"
3274
3169
  ],
3275
3170
  "flags": {
3276
3171
  "json": {
@@ -3283,7 +3178,7 @@
3283
3178
  },
3284
3179
  "hasDynamicHelp": false,
3285
3180
  "hiddenAliases": [],
3286
- "id": "asa:automations:get",
3181
+ "id": "asa:ads:get",
3287
3182
  "pluginAlias": "adapty",
3288
3183
  "pluginName": "adapty",
3289
3184
  "pluginType": "core",
@@ -3294,16 +3189,17 @@
3294
3189
  "dist",
3295
3190
  "commands",
3296
3191
  "asa",
3297
- "automations",
3192
+ "ads",
3298
3193
  "get.js"
3299
3194
  ]
3300
3195
  },
3301
- "asa:automations:list": {
3196
+ "asa:ads:list": {
3302
3197
  "aliases": [],
3303
3198
  "args": {},
3304
- "description": "List automation rules; status 1 is active, 0 is stopped",
3199
+ "description": "List ads; serving_state_reasons explains why an enabled ad is not running",
3305
3200
  "examples": [
3306
- "<%= config.bin %> asa automations list"
3201
+ "<%= config.bin %> asa ads list",
3202
+ "<%= config.bin %> asa ads list --ad-group AD_GROUP_UUID --status ENABLED"
3307
3203
  ],
3308
3204
  "flags": {
3309
3205
  "json": {
@@ -3328,11 +3224,50 @@
3328
3224
  "hasDynamicHelp": false,
3329
3225
  "multiple": false,
3330
3226
  "type": "option"
3227
+ },
3228
+ "ad-group": {
3229
+ "description": "Keep only rows in this ad group; repeatable",
3230
+ "name": "ad-group",
3231
+ "hasDynamicHelp": false,
3232
+ "multiple": true,
3233
+ "type": "option"
3234
+ },
3235
+ "campaign": {
3236
+ "description": "Keep only rows in this campaign; repeatable",
3237
+ "name": "campaign",
3238
+ "hasDynamicHelp": false,
3239
+ "multiple": true,
3240
+ "type": "option"
3241
+ },
3242
+ "campaign-group": {
3243
+ "description": "Keep only rows in this campaign group; repeatable",
3244
+ "name": "campaign-group",
3245
+ "hasDynamicHelp": false,
3246
+ "multiple": true,
3247
+ "type": "option"
3248
+ },
3249
+ "search": {
3250
+ "description": "Case-insensitive substring match on the name",
3251
+ "name": "search",
3252
+ "hasDynamicHelp": false,
3253
+ "multiple": false,
3254
+ "type": "option"
3255
+ },
3256
+ "status": {
3257
+ "description": "Keep only rows in this state",
3258
+ "name": "status",
3259
+ "hasDynamicHelp": false,
3260
+ "multiple": false,
3261
+ "options": [
3262
+ "ENABLED",
3263
+ "PAUSED"
3264
+ ],
3265
+ "type": "option"
3331
3266
  }
3332
3267
  },
3333
3268
  "hasDynamicHelp": false,
3334
3269
  "hiddenAliases": [],
3335
- "id": "asa:automations:list",
3270
+ "id": "asa:ads:list",
3336
3271
  "pluginAlias": "adapty",
3337
3272
  "pluginName": "adapty",
3338
3273
  "pluginType": "core",
@@ -3343,23 +3278,22 @@
3343
3278
  "dist",
3344
3279
  "commands",
3345
3280
  "asa",
3346
- "automations",
3281
+ "ads",
3347
3282
  "list.js"
3348
3283
  ]
3349
3284
  },
3350
- "asa:automations:run": {
3285
+ "asa:ads:update": {
3351
3286
  "aliases": [],
3352
3287
  "args": {
3353
- "automation_id": {
3354
- "description": "Automation rule ID (UUID)",
3355
- "name": "automation_id",
3288
+ "ad_id": {
3289
+ "description": "Ad ID (UUID)",
3290
+ "name": "ad_id",
3356
3291
  "required": true
3357
3292
  }
3358
3293
  },
3359
- "description": "Run an automation rule now; the run is queued, not awaited",
3294
+ "description": "Rename an ad or pause it; the creative and ad group are fixed at creation",
3360
3295
  "examples": [
3361
- "<%= config.bin %> asa automations run UUID",
3362
- "<%= config.bin %> asa automations run UUID --dry-run"
3296
+ "<%= config.bin %> asa ads update UUID --status PAUSED"
3363
3297
  ],
3364
3298
  "flags": {
3365
3299
  "json": {
@@ -3383,16 +3317,28 @@
3383
3317
  "multiple": false,
3384
3318
  "type": "option"
3385
3319
  },
3386
- "dry-run": {
3387
- "description": "Evaluate and log the rule without touching Apple",
3388
- "name": "dry-run",
3389
- "allowNo": false,
3390
- "type": "boolean"
3391
- }
3320
+ "name": {
3321
+ "description": "Ad name",
3322
+ "name": "name",
3323
+ "hasDynamicHelp": false,
3324
+ "multiple": false,
3325
+ "type": "option"
3326
+ },
3327
+ "status": {
3328
+ "description": "Ad status",
3329
+ "name": "status",
3330
+ "hasDynamicHelp": false,
3331
+ "multiple": false,
3332
+ "options": [
3333
+ "ENABLED",
3334
+ "PAUSED"
3335
+ ],
3336
+ "type": "option"
3337
+ }
3392
3338
  },
3393
3339
  "hasDynamicHelp": false,
3394
3340
  "hiddenAliases": [],
3395
- "id": "asa:automations:run",
3341
+ "id": "asa:ads:update",
3396
3342
  "pluginAlias": "adapty",
3397
3343
  "pluginName": "adapty",
3398
3344
  "pluginType": "core",
@@ -3403,22 +3349,17 @@
3403
3349
  "dist",
3404
3350
  "commands",
3405
3351
  "asa",
3406
- "automations",
3407
- "run.js"
3352
+ "ads",
3353
+ "update.js"
3408
3354
  ]
3409
3355
  },
3410
- "asa:automations:runs": {
3356
+ "asa:apps:list": {
3411
3357
  "aliases": [],
3412
- "args": {
3413
- "automation_id": {
3414
- "description": "Automation rule ID (UUID)",
3415
- "name": "automation_id",
3416
- "required": true
3417
- }
3418
- },
3419
- "description": "List past runs of an automation rule, including dry runs",
3358
+ "args": {},
3359
+ "description": "List the apps promoted by this company in Apple Search Ads",
3420
3360
  "examples": [
3421
- "<%= config.bin %> asa automations runs 550e8400-e29b-41d4-a716-446655440000"
3361
+ "<%= config.bin %> asa apps list",
3362
+ "<%= config.bin %> asa apps list --page 2 --page-size 50"
3422
3363
  ],
3423
3364
  "flags": {
3424
3365
  "json": {
@@ -3447,7 +3388,7 @@
3447
3388
  },
3448
3389
  "hasDynamicHelp": false,
3449
3390
  "hiddenAliases": [],
3450
- "id": "asa:automations:runs",
3391
+ "id": "asa:apps:list",
3451
3392
  "pluginAlias": "adapty",
3452
3393
  "pluginName": "adapty",
3453
3394
  "pluginType": "core",
@@ -3458,24 +3399,19 @@
3458
3399
  "dist",
3459
3400
  "commands",
3460
3401
  "asa",
3461
- "automations",
3462
- "runs.js"
3402
+ "apps",
3403
+ "list.js"
3463
3404
  ]
3464
3405
  },
3465
- "asa:automations:update": {
3406
+ "asa:automations:create": {
3466
3407
  "aliases": [],
3467
- "args": {
3468
- "automation_id": {
3469
- "description": "Automation rule ID (UUID)",
3470
- "name": "automation_id",
3471
- "required": true
3472
- }
3473
- },
3474
- "description": "Change an automation rule: stop it, rename it, or replace parts of the rule. An add-as-keyword action flag turns the call into a read-modify-write: the rule is read, actions[0].params is rebuilt from the flags and the whole actions list is written back — an edit someone makes in the dashboard in between is overwritten. This is also the way to repair a rule whose stored params carry the wrong shape.",
3408
+ "args": {},
3409
+ "description": "Create an automation rule from a JSON rule file. The add-as-keyword action flags fill in or override actions[0].params, so the bid, the match type and the target ad groups need no hand-written JSON.",
3475
3410
  "examples": [
3476
- "<%= config.bin %> asa automations update UUID --stop",
3477
- "<%= config.bin %> asa automations update UUID --file rule.json",
3478
- "<%= config.bin %> asa automations update UUID --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type search_term_current_cpt"
3411
+ "<%= config.bin %> asa automations create --file rule.json",
3412
+ "<%= config.bin %> asa automations create --file rule.json --run-now",
3413
+ "<%= config.bin %> asa automations create --file rule.json --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type search_term_current_cpt",
3414
+ "<%= config.bin %> asa automations create --file rule.json --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type set_to --cpt-bid 1.50 --negate ad-group"
3479
3415
  ],
3480
3416
  "flags": {
3481
3417
  "json": {
@@ -3573,41 +3509,23 @@
3573
3509
  "type": "option"
3574
3510
  },
3575
3511
  "file": {
3576
- "description": "JSON file with the parts to change, or - to read stdin",
3512
+ "description": "JSON file with the rule body, or - to read stdin",
3577
3513
  "name": "file",
3514
+ "required": true,
3578
3515
  "hasDynamicHelp": false,
3579
3516
  "multiple": false,
3580
3517
  "type": "option"
3581
3518
  },
3582
- "name": {
3583
- "description": "Rule name",
3584
- "name": "name",
3585
- "hasDynamicHelp": false,
3586
- "multiple": false,
3587
- "type": "option"
3588
- },
3589
- "start": {
3590
- "description": "Activate the rule",
3591
- "exclusive": [
3592
- "stop"
3593
- ],
3594
- "name": "start",
3595
- "allowNo": false,
3596
- "type": "boolean"
3597
- },
3598
- "stop": {
3599
- "description": "Stop the rule and clear its next run",
3600
- "exclusive": [
3601
- "start"
3602
- ],
3603
- "name": "stop",
3519
+ "run-now": {
3520
+ "description": "Queue the first run right after the rule is stored",
3521
+ "name": "run-now",
3604
3522
  "allowNo": false,
3605
3523
  "type": "boolean"
3606
3524
  }
3607
3525
  },
3608
3526
  "hasDynamicHelp": false,
3609
3527
  "hiddenAliases": [],
3610
- "id": "asa:automations:update",
3528
+ "id": "asa:automations:create",
3611
3529
  "pluginAlias": "adapty",
3612
3530
  "pluginName": "adapty",
3613
3531
  "pluginType": "core",
@@ -3619,103 +3537,21 @@
3619
3537
  "commands",
3620
3538
  "asa",
3621
3539
  "automations",
3622
- "update.js"
3623
- ]
3624
- },
3625
- "asa:ads:create": {
3626
- "aliases": [],
3627
- "args": {},
3628
- "description": "Create an ad from a creative in an ad group",
3629
- "examples": [
3630
- "<%= config.bin %> asa ads create --ad-group UUID --creative-id 4321 --name \"Summer ad\""
3631
- ],
3632
- "flags": {
3633
- "json": {
3634
- "description": "Format output as json.",
3635
- "helpGroup": "GLOBAL",
3636
- "name": "json",
3637
- "allowNo": false,
3638
- "type": "boolean"
3639
- },
3640
- "yes": {
3641
- "char": "y",
3642
- "description": "Apply without asking; required when the output is piped or --json is used",
3643
- "name": "yes",
3644
- "allowNo": false,
3645
- "type": "boolean"
3646
- },
3647
- "idempotency-key": {
3648
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3649
- "name": "idempotency-key",
3650
- "hasDynamicHelp": false,
3651
- "multiple": false,
3652
- "type": "option"
3653
- },
3654
- "ad-group": {
3655
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
3656
- "name": "ad-group",
3657
- "required": true,
3658
- "hasDynamicHelp": false,
3659
- "multiple": false,
3660
- "type": "option"
3661
- },
3662
- "creative-id": {
3663
- "description": "Apple creative ID from a product page or the default set",
3664
- "name": "creative-id",
3665
- "required": true,
3666
- "hasDynamicHelp": false,
3667
- "multiple": false,
3668
- "type": "option"
3669
- },
3670
- "name": {
3671
- "description": "Ad name",
3672
- "name": "name",
3673
- "required": true,
3674
- "hasDynamicHelp": false,
3675
- "multiple": false,
3676
- "type": "option"
3677
- },
3678
- "status": {
3679
- "description": "Initial status",
3680
- "name": "status",
3681
- "hasDynamicHelp": false,
3682
- "multiple": false,
3683
- "options": [
3684
- "ENABLED",
3685
- "PAUSED"
3686
- ],
3687
- "type": "option"
3688
- }
3689
- },
3690
- "hasDynamicHelp": false,
3691
- "hiddenAliases": [],
3692
- "id": "asa:ads:create",
3693
- "pluginAlias": "adapty",
3694
- "pluginName": "adapty",
3695
- "pluginType": "core",
3696
- "strict": true,
3697
- "enableJsonFlag": true,
3698
- "isESM": true,
3699
- "relativePath": [
3700
- "dist",
3701
- "commands",
3702
- "asa",
3703
- "ads",
3704
3540
  "create.js"
3705
3541
  ]
3706
3542
  },
3707
- "asa:ads:get": {
3543
+ "asa:automations:get": {
3708
3544
  "aliases": [],
3709
3545
  "args": {
3710
- "ad_id": {
3711
- "description": "Ad ID (UUID)",
3712
- "name": "ad_id",
3546
+ "automation_id": {
3547
+ "description": "Automation rule ID (UUID)",
3548
+ "name": "automation_id",
3713
3549
  "required": true
3714
3550
  }
3715
3551
  },
3716
- "description": "Show one ad and its serving state",
3552
+ "description": "Show one automation rule with its conditions and actions",
3717
3553
  "examples": [
3718
- "<%= config.bin %> asa ads get 550e8400-e29b-41d4-a716-446655440000"
3554
+ "<%= config.bin %> asa automations get 550e8400-e29b-41d4-a716-446655440000"
3719
3555
  ],
3720
3556
  "flags": {
3721
3557
  "json": {
@@ -3728,7 +3564,7 @@
3728
3564
  },
3729
3565
  "hasDynamicHelp": false,
3730
3566
  "hiddenAliases": [],
3731
- "id": "asa:ads:get",
3567
+ "id": "asa:automations:get",
3732
3568
  "pluginAlias": "adapty",
3733
3569
  "pluginName": "adapty",
3734
3570
  "pluginType": "core",
@@ -3739,17 +3575,16 @@
3739
3575
  "dist",
3740
3576
  "commands",
3741
3577
  "asa",
3742
- "ads",
3578
+ "automations",
3743
3579
  "get.js"
3744
3580
  ]
3745
3581
  },
3746
- "asa:ads:list": {
3582
+ "asa:automations:list": {
3747
3583
  "aliases": [],
3748
3584
  "args": {},
3749
- "description": "List ads; serving_state_reasons explains why an enabled ad is not running",
3585
+ "description": "List automation rules; status 1 is active, 0 is stopped",
3750
3586
  "examples": [
3751
- "<%= config.bin %> asa ads list",
3752
- "<%= config.bin %> asa ads list --ad-group AD_GROUP_UUID --status ENABLED"
3587
+ "<%= config.bin %> asa automations list"
3753
3588
  ],
3754
3589
  "flags": {
3755
3590
  "json": {
@@ -3774,50 +3609,11 @@
3774
3609
  "hasDynamicHelp": false,
3775
3610
  "multiple": false,
3776
3611
  "type": "option"
3777
- },
3778
- "ad-group": {
3779
- "description": "Keep only rows in this ad group; repeatable",
3780
- "name": "ad-group",
3781
- "hasDynamicHelp": false,
3782
- "multiple": true,
3783
- "type": "option"
3784
- },
3785
- "campaign": {
3786
- "description": "Keep only rows in this campaign; repeatable",
3787
- "name": "campaign",
3788
- "hasDynamicHelp": false,
3789
- "multiple": true,
3790
- "type": "option"
3791
- },
3792
- "campaign-group": {
3793
- "description": "Keep only rows in this campaign group; repeatable",
3794
- "name": "campaign-group",
3795
- "hasDynamicHelp": false,
3796
- "multiple": true,
3797
- "type": "option"
3798
- },
3799
- "search": {
3800
- "description": "Case-insensitive substring match on the name",
3801
- "name": "search",
3802
- "hasDynamicHelp": false,
3803
- "multiple": false,
3804
- "type": "option"
3805
- },
3806
- "status": {
3807
- "description": "Keep only rows in this state",
3808
- "name": "status",
3809
- "hasDynamicHelp": false,
3810
- "multiple": false,
3811
- "options": [
3812
- "ENABLED",
3813
- "PAUSED"
3814
- ],
3815
- "type": "option"
3816
3612
  }
3817
3613
  },
3818
3614
  "hasDynamicHelp": false,
3819
3615
  "hiddenAliases": [],
3820
- "id": "asa:ads:list",
3616
+ "id": "asa:automations:list",
3821
3617
  "pluginAlias": "adapty",
3822
3618
  "pluginName": "adapty",
3823
3619
  "pluginType": "core",
@@ -3828,22 +3624,23 @@
3828
3624
  "dist",
3829
3625
  "commands",
3830
3626
  "asa",
3831
- "ads",
3627
+ "automations",
3832
3628
  "list.js"
3833
3629
  ]
3834
3630
  },
3835
- "asa:ads:update": {
3631
+ "asa:automations:run": {
3836
3632
  "aliases": [],
3837
3633
  "args": {
3838
- "ad_id": {
3839
- "description": "Ad ID (UUID)",
3840
- "name": "ad_id",
3634
+ "automation_id": {
3635
+ "description": "Automation rule ID (UUID)",
3636
+ "name": "automation_id",
3841
3637
  "required": true
3842
3638
  }
3843
3639
  },
3844
- "description": "Rename an ad or pause it; the creative and ad group are fixed at creation",
3640
+ "description": "Run an automation rule now; the run is queued, not awaited",
3845
3641
  "examples": [
3846
- "<%= config.bin %> asa ads update UUID --status PAUSED"
3642
+ "<%= config.bin %> asa automations run UUID",
3643
+ "<%= config.bin %> asa automations run UUID --dry-run"
3847
3644
  ],
3848
3645
  "flags": {
3849
3646
  "json": {
@@ -3867,28 +3664,231 @@
3867
3664
  "multiple": false,
3868
3665
  "type": "option"
3869
3666
  },
3870
- "name": {
3871
- "description": "Ad name",
3872
- "name": "name",
3667
+ "dry-run": {
3668
+ "description": "Evaluate and log the rule without touching Apple",
3669
+ "name": "dry-run",
3670
+ "allowNo": false,
3671
+ "type": "boolean"
3672
+ }
3673
+ },
3674
+ "hasDynamicHelp": false,
3675
+ "hiddenAliases": [],
3676
+ "id": "asa:automations:run",
3677
+ "pluginAlias": "adapty",
3678
+ "pluginName": "adapty",
3679
+ "pluginType": "core",
3680
+ "strict": true,
3681
+ "enableJsonFlag": true,
3682
+ "isESM": true,
3683
+ "relativePath": [
3684
+ "dist",
3685
+ "commands",
3686
+ "asa",
3687
+ "automations",
3688
+ "run.js"
3689
+ ]
3690
+ },
3691
+ "asa:automations:runs": {
3692
+ "aliases": [],
3693
+ "args": {
3694
+ "automation_id": {
3695
+ "description": "Automation rule ID (UUID)",
3696
+ "name": "automation_id",
3697
+ "required": true
3698
+ }
3699
+ },
3700
+ "description": "List past runs of an automation rule, including dry runs",
3701
+ "examples": [
3702
+ "<%= config.bin %> asa automations runs 550e8400-e29b-41d4-a716-446655440000"
3703
+ ],
3704
+ "flags": {
3705
+ "json": {
3706
+ "description": "Format output as json.",
3707
+ "helpGroup": "GLOBAL",
3708
+ "name": "json",
3709
+ "allowNo": false,
3710
+ "type": "boolean"
3711
+ },
3712
+ "page": {
3713
+ "description": "Page number",
3714
+ "name": "page",
3715
+ "default": 1,
3873
3716
  "hasDynamicHelp": false,
3874
3717
  "multiple": false,
3875
3718
  "type": "option"
3876
3719
  },
3877
- "status": {
3878
- "description": "Ad status",
3879
- "name": "status",
3720
+ "page-size": {
3721
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3722
+ "name": "page-size",
3723
+ "default": 100,
3724
+ "hasDynamicHelp": false,
3725
+ "multiple": false,
3726
+ "type": "option"
3727
+ }
3728
+ },
3729
+ "hasDynamicHelp": false,
3730
+ "hiddenAliases": [],
3731
+ "id": "asa:automations:runs",
3732
+ "pluginAlias": "adapty",
3733
+ "pluginName": "adapty",
3734
+ "pluginType": "core",
3735
+ "strict": true,
3736
+ "enableJsonFlag": true,
3737
+ "isESM": true,
3738
+ "relativePath": [
3739
+ "dist",
3740
+ "commands",
3741
+ "asa",
3742
+ "automations",
3743
+ "runs.js"
3744
+ ]
3745
+ },
3746
+ "asa:automations:update": {
3747
+ "aliases": [],
3748
+ "args": {
3749
+ "automation_id": {
3750
+ "description": "Automation rule ID (UUID)",
3751
+ "name": "automation_id",
3752
+ "required": true
3753
+ }
3754
+ },
3755
+ "description": "Change an automation rule: stop it, rename it, or replace parts of the rule. An add-as-keyword action flag turns the call into a read-modify-write: the rule is read, actions[0].params is rebuilt from the flags and the whole actions list is written back — an edit someone makes in the dashboard in between is overwritten. This is also the way to repair a rule whose stored params carry the wrong shape.",
3756
+ "examples": [
3757
+ "<%= config.bin %> asa automations update UUID --stop",
3758
+ "<%= config.bin %> asa automations update UUID --file rule.json",
3759
+ "<%= config.bin %> asa automations update UUID --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type search_term_current_cpt"
3760
+ ],
3761
+ "flags": {
3762
+ "json": {
3763
+ "description": "Format output as json.",
3764
+ "helpGroup": "GLOBAL",
3765
+ "name": "json",
3766
+ "allowNo": false,
3767
+ "type": "boolean"
3768
+ },
3769
+ "cpt-bid": {
3770
+ "description": "cpt_bid.value: the bid itself with --cpt-bid-type set_to, or a percent markup on the entity bid with search_term_current_cpt / keyword_current_bid; not accepted with ad_group_default_bid",
3771
+ "name": "cpt-bid",
3772
+ "hasDynamicHelp": false,
3773
+ "multiple": false,
3774
+ "type": "option"
3775
+ },
3776
+ "cpt-bid-type": {
3777
+ "description": "Where the bid of the created keyword comes from; the API has no default",
3778
+ "name": "cpt-bid-type",
3880
3779
  "hasDynamicHelp": false,
3881
3780
  "multiple": false,
3882
3781
  "options": [
3883
- "ENABLED",
3884
- "PAUSED"
3782
+ "ad_group_default_bid",
3783
+ "keyword_current_bid",
3784
+ "search_term_current_cpt",
3785
+ "set_to"
3786
+ ],
3787
+ "type": "option"
3788
+ },
3789
+ "match-type": {
3790
+ "description": "Match type of the created keyword; the API has no default",
3791
+ "name": "match-type",
3792
+ "hasDynamicHelp": false,
3793
+ "multiple": false,
3794
+ "options": [
3795
+ "BROAD",
3796
+ "EXACT"
3797
+ ],
3798
+ "type": "option"
3799
+ },
3800
+ "negate": {
3801
+ "description": "Also add the search term as a negative keyword at this level (search-term rules)",
3802
+ "exclusive": [
3803
+ "no-negate"
3804
+ ],
3805
+ "name": "negate",
3806
+ "hasDynamicHelp": false,
3807
+ "multiple": false,
3808
+ "options": [
3809
+ "ad-group",
3810
+ "campaign"
3885
3811
  ],
3886
3812
  "type": "option"
3813
+ },
3814
+ "no-negate": {
3815
+ "description": "Leave no negative keyword behind (search-term rules)",
3816
+ "exclusive": [
3817
+ "negate"
3818
+ ],
3819
+ "name": "no-negate",
3820
+ "allowNo": false,
3821
+ "type": "boolean"
3822
+ },
3823
+ "pause-original": {
3824
+ "description": "Pause the source keyword in its own ad group (targeting-keyword rules)",
3825
+ "name": "pause-original",
3826
+ "allowNo": true,
3827
+ "type": "boolean"
3828
+ },
3829
+ "skip-enable-duplicates": {
3830
+ "description": "Skip a keyword that already exists in the target ad group instead of enabling it (search-term rules)",
3831
+ "name": "skip-enable-duplicates",
3832
+ "allowNo": true,
3833
+ "type": "boolean"
3834
+ },
3835
+ "target-ad-group": {
3836
+ "description": "Ad group the keyword is added to (UUID), repeatable; a rule without one does nothing",
3837
+ "name": "target-ad-group",
3838
+ "hasDynamicHelp": false,
3839
+ "multiple": true,
3840
+ "type": "option"
3841
+ },
3842
+ "yes": {
3843
+ "char": "y",
3844
+ "description": "Apply without asking; required when the output is piped or --json is used",
3845
+ "name": "yes",
3846
+ "allowNo": false,
3847
+ "type": "boolean"
3848
+ },
3849
+ "idempotency-key": {
3850
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3851
+ "name": "idempotency-key",
3852
+ "hasDynamicHelp": false,
3853
+ "multiple": false,
3854
+ "type": "option"
3855
+ },
3856
+ "file": {
3857
+ "description": "JSON file with the parts to change, or - to read stdin",
3858
+ "name": "file",
3859
+ "hasDynamicHelp": false,
3860
+ "multiple": false,
3861
+ "type": "option"
3862
+ },
3863
+ "name": {
3864
+ "description": "Rule name",
3865
+ "name": "name",
3866
+ "hasDynamicHelp": false,
3867
+ "multiple": false,
3868
+ "type": "option"
3869
+ },
3870
+ "start": {
3871
+ "description": "Activate the rule",
3872
+ "exclusive": [
3873
+ "stop"
3874
+ ],
3875
+ "name": "start",
3876
+ "allowNo": false,
3877
+ "type": "boolean"
3878
+ },
3879
+ "stop": {
3880
+ "description": "Stop the rule and clear its next run",
3881
+ "exclusive": [
3882
+ "start"
3883
+ ],
3884
+ "name": "stop",
3885
+ "allowNo": false,
3886
+ "type": "boolean"
3887
3887
  }
3888
3888
  },
3889
3889
  "hasDynamicHelp": false,
3890
3890
  "hiddenAliases": [],
3891
- "id": "asa:ads:update",
3891
+ "id": "asa:automations:update",
3892
3892
  "pluginAlias": "adapty",
3893
3893
  "pluginName": "adapty",
3894
3894
  "pluginType": "core",
@@ -3899,7 +3899,7 @@
3899
3899
  "dist",
3900
3900
  "commands",
3901
3901
  "asa",
3902
- "ads",
3902
+ "automations",
3903
3903
  "update.js"
3904
3904
  ]
3905
3905
  },
@@ -4712,17 +4712,13 @@
4712
4712
  "list.js"
4713
4713
  ]
4714
4714
  },
4715
- "asa:metrics": {
4715
+ "asa:keywords:add": {
4716
4716
  "aliases": [],
4717
4717
  "args": {},
4718
- "description": "Query metrics for any level of the account over a date range\n\nOne row per entity, already aggregated server-side and sorted by --order-by, so a top-N question is one\ncall with --order-by and --page-size N — never sum pages yourself. Account-level totals are one call to\nasa metrics overview instead. The date window is capped by the finest --group-by period: 28 days when\nday is grouped, 90 with no period grouping, 180 by week, 365 by month and coarser — widen the window by\ncoarsening the grouping, not by splitting into more calls. Each page is also capped at a breakdown-row\ncount (entities × countries × periods); over it the call fails with 422 cli_response_too_large naming the\npage[size] that fits — coarsen the grouping, narrow the window, or reduce page[size].\n\nMoney columns are in the campaign group currency, not USD, and spend and local_spend carry the same\nfigure; the currency itself comes from asa orgs list. Rate budgets and the breakdown-row cap are set per\ncompany: read the current ones with asa whoami rather than assuming a default. meta.pagination.count is\nthe full entity count behind the filters, so take inventory from there instead of counting the rows on a\npage. meta.max_valid_day says how many days the youngest cohort in the window has lived — any --by-days\nwindow above it repeats the last real figure because that time has not passed yet, so treat those as\nunreached rather than as a plateau.\n\n--metric is required and every metric named is computed over the whole entity set, so ask for the\ncolumns you actually read. subscribers and paid_subscribers (and arppu / arpas, which derive from them)\ncount unique profiles per entity and cost roughly seventeen times the rest; whatever the --entity, they\nare refused unless --campaign or --ad-group scopes the call. Those scope flags are also the cheapest way\nto make any call fast, since cost follows the number of entities aggregated, not the page size.",
4718
+ "description": "Add targeting keywords to an ad group",
4719
4719
  "examples": [
4720
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric adapty_installs",
4721
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --order-by spend --page-size 5",
4722
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --group-by country --page-size 1000",
4723
- "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric roas",
4724
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric roas --by-days 7 --by-days 90",
4725
- "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric arpas --campaign 0f0e..."
4720
+ "<%= config.bin %> asa keywords add --ad-group UUID --text \"running shoes\" --text \"trail shoes\" --bid 1.20",
4721
+ "<%= config.bin %> asa keywords add --ad-group UUID --from-file keywords.txt --match-type EXACT"
4726
4722
  ],
4727
4723
  "flags": {
4728
4724
  "json": {
@@ -4732,274 +4728,24 @@
4732
4728
  "allowNo": false,
4733
4729
  "type": "boolean"
4734
4730
  },
4735
- "page": {
4736
- "description": "Page number",
4737
- "name": "page",
4738
- "default": 1,
4731
+ "currency": {
4732
+ "description": "Currency code for the amounts in this call",
4733
+ "name": "currency",
4734
+ "default": "USD",
4739
4735
  "hasDynamicHelp": false,
4740
4736
  "multiple": false,
4741
4737
  "type": "option"
4742
4738
  },
4743
- "page-size": {
4744
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4745
- "name": "page-size",
4746
- "default": 100,
4747
- "hasDynamicHelp": false,
4748
- "multiple": false,
4749
- "type": "option"
4750
- },
4751
- "by-days": {
4752
- "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
4753
- "name": "by-days",
4754
- "hasDynamicHelp": false,
4755
- "multiple": true,
4756
- "type": "option"
4757
- },
4758
- "ad-group": {
4759
- "description": "Keep only rows in this ad group; repeatable",
4760
- "name": "ad-group",
4761
- "hasDynamicHelp": false,
4762
- "multiple": true,
4763
- "type": "option"
4764
- },
4765
- "app": {
4766
- "description": "Keep only rows in this app; repeatable",
4767
- "name": "app",
4768
- "hasDynamicHelp": false,
4769
- "multiple": true,
4770
- "type": "option"
4771
- },
4772
- "campaign": {
4773
- "description": "Keep only rows in this campaign; repeatable",
4774
- "name": "campaign",
4775
- "hasDynamicHelp": false,
4776
- "multiple": true,
4777
- "type": "option"
4778
- },
4779
- "date-from": {
4780
- "description": "Start of the period (YYYY-MM-DD)",
4781
- "name": "date-from",
4782
- "required": true,
4783
- "hasDynamicHelp": false,
4784
- "multiple": false,
4785
- "type": "option"
4786
- },
4787
- "date-to": {
4788
- "description": "End of the period (YYYY-MM-DD)",
4789
- "name": "date-to",
4790
- "required": true,
4791
- "hasDynamicHelp": false,
4792
- "multiple": false,
4793
- "type": "option"
4794
- },
4795
- "entity": {
4796
- "description": "What to report on",
4797
- "name": "entity",
4798
- "required": true,
4799
- "hasDynamicHelp": false,
4800
- "multiple": false,
4801
- "options": [
4802
- "ad",
4803
- "ad-group",
4804
- "campaign",
4805
- "keyword"
4806
- ],
4807
- "type": "option"
4808
- },
4809
- "group-by": {
4810
- "description": "Break the rows down by a dimension, repeatable",
4811
- "name": "group-by",
4812
- "hasDynamicHelp": false,
4813
- "multiple": true,
4814
- "options": [
4815
- "country",
4816
- "day",
4817
- "month",
4818
- "quarter",
4819
- "week",
4820
- "year"
4821
- ],
4822
- "type": "option"
4823
- },
4824
- "metric": {
4825
- "description": "Metric name (dashboard nomenclature, e.g. spend, taps, gross_roas), repeatable and required; every metric asked for is computed over the whole entity set, so list only what you read; a wrong name fails listing all valid ones",
4826
- "name": "metric",
4827
- "required": true,
4828
- "hasDynamicHelp": false,
4829
- "multiple": true,
4830
- "type": "option"
4831
- },
4832
- "order": {
4833
- "description": "Sort direction",
4834
- "name": "order",
4835
- "default": "desc",
4836
- "hasDynamicHelp": false,
4837
- "multiple": false,
4838
- "options": [
4839
- "asc",
4840
- "desc"
4841
- ],
4842
- "type": "option"
4843
- },
4844
- "order-by": {
4845
- "description": "Metric or field to sort by; cohort metrics rank via their gross_/proceeds_/net_ names",
4846
- "name": "order-by",
4847
- "hasDynamicHelp": false,
4848
- "multiple": false,
4849
- "type": "option"
4850
- },
4851
- "order-by-day": {
4852
- "description": "Rank by a cohort metric at this renewal window; must be one of the --by-days values",
4853
- "name": "order-by-day",
4854
- "hasDynamicHelp": false,
4855
- "multiple": false,
4856
- "type": "option"
4857
- }
4858
- },
4859
- "hasDynamicHelp": false,
4860
- "hiddenAliases": [],
4861
- "id": "asa:metrics",
4862
- "pluginAlias": "adapty",
4863
- "pluginName": "adapty",
4864
- "pluginType": "core",
4865
- "strict": true,
4866
- "enableJsonFlag": true,
4867
- "isESM": true,
4868
- "relativePath": [
4869
- "dist",
4870
- "commands",
4871
- "asa",
4872
- "metrics",
4873
- "index.js"
4874
- ]
4875
- },
4876
- "asa:metrics:overview": {
4877
- "aliases": [],
4878
- "args": {},
4879
- "description": "Totals for a period, optionally split into day, week or month buckets\n\nThe one-call answer to \"how much did I spend / earn overall\" and to any single-period trend question:\ntotals for the whole entity level plus a per-period series, no pagination, no client-side summing. The\ndate window is capped by --period-unit: 90 days at day, 180 by week, 365 by month and coarser. Shares\nthe 5-per-minute metrics budget with asa metrics.",
4880
- "examples": [
4881
- "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
4882
- "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --period-unit WEEK"
4883
- ],
4884
- "flags": {
4885
- "json": {
4886
- "description": "Format output as json.",
4887
- "helpGroup": "GLOBAL",
4888
- "name": "json",
4889
- "allowNo": false,
4890
- "type": "boolean"
4891
- },
4892
- "by-days": {
4893
- "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
4894
- "name": "by-days",
4895
- "hasDynamicHelp": false,
4896
- "multiple": true,
4897
- "type": "option"
4898
- },
4899
- "date-from": {
4900
- "description": "Start of the period (YYYY-MM-DD)",
4901
- "name": "date-from",
4902
- "required": true,
4903
- "hasDynamicHelp": false,
4904
- "multiple": false,
4905
- "type": "option"
4906
- },
4907
- "date-to": {
4908
- "description": "End of the period (YYYY-MM-DD)",
4909
- "name": "date-to",
4910
- "required": true,
4911
- "hasDynamicHelp": false,
4912
- "multiple": false,
4913
- "type": "option"
4914
- },
4915
- "entity": {
4916
- "description": "What to report on",
4917
- "name": "entity",
4918
- "required": true,
4919
- "hasDynamicHelp": false,
4920
- "multiple": false,
4921
- "options": [
4922
- "ad",
4923
- "ad-group",
4924
- "campaign",
4925
- "keyword"
4926
- ],
4927
- "type": "option"
4928
- },
4929
- "metric": {
4930
- "description": "Metric name, repeatable; cohort roots only here (revenue, roas, arpu), not their gross_/proceeds_/net_ variants; omit for every metric",
4931
- "name": "metric",
4932
- "hasDynamicHelp": false,
4933
- "multiple": true,
4934
- "type": "option"
4935
- },
4936
- "period-unit": {
4937
- "description": "Bucket size",
4938
- "name": "period-unit",
4939
- "default": "day",
4940
- "hasDynamicHelp": false,
4941
- "multiple": false,
4942
- "options": [
4943
- "day",
4944
- "month",
4945
- "quarter",
4946
- "week",
4947
- "year"
4948
- ],
4949
- "type": "option"
4950
- }
4951
- },
4952
- "hasDynamicHelp": false,
4953
- "hiddenAliases": [],
4954
- "id": "asa:metrics:overview",
4955
- "pluginAlias": "adapty",
4956
- "pluginName": "adapty",
4957
- "pluginType": "core",
4958
- "strict": true,
4959
- "enableJsonFlag": true,
4960
- "isESM": true,
4961
- "relativePath": [
4962
- "dist",
4963
- "commands",
4964
- "asa",
4965
- "metrics",
4966
- "overview.js"
4967
- ]
4968
- },
4969
- "asa:keywords:add": {
4970
- "aliases": [],
4971
- "args": {},
4972
- "description": "Add targeting keywords to an ad group",
4973
- "examples": [
4974
- "<%= config.bin %> asa keywords add --ad-group UUID --text \"running shoes\" --text \"trail shoes\" --bid 1.20",
4975
- "<%= config.bin %> asa keywords add --ad-group UUID --from-file keywords.txt --match-type EXACT"
4976
- ],
4977
- "flags": {
4978
- "json": {
4979
- "description": "Format output as json.",
4980
- "helpGroup": "GLOBAL",
4981
- "name": "json",
4982
- "allowNo": false,
4983
- "type": "boolean"
4984
- },
4985
- "currency": {
4986
- "description": "Currency code for the amounts in this call",
4987
- "name": "currency",
4988
- "default": "USD",
4989
- "hasDynamicHelp": false,
4990
- "multiple": false,
4991
- "type": "option"
4992
- },
4993
- "yes": {
4994
- "char": "y",
4995
- "description": "Apply without asking; required when the output is piped or --json is used",
4996
- "name": "yes",
4997
- "allowNo": false,
4998
- "type": "boolean"
4999
- },
5000
- "idempotency-key": {
5001
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
5002
- "name": "idempotency-key",
4739
+ "yes": {
4740
+ "char": "y",
4741
+ "description": "Apply without asking; required when the output is piped or --json is used",
4742
+ "name": "yes",
4743
+ "allowNo": false,
4744
+ "type": "boolean"
4745
+ },
4746
+ "idempotency-key": {
4747
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4748
+ "name": "idempotency-key",
5003
4749
  "hasDynamicHelp": false,
5004
4750
  "multiple": false,
5005
4751
  "type": "option"
@@ -5332,12 +5078,174 @@
5332
5078
  "update.js"
5333
5079
  ]
5334
5080
  },
5335
- "asa:orgs:list": {
5081
+ "asa:metrics": {
5336
5082
  "aliases": [],
5337
5083
  "args": {},
5338
- "description": "List the Apple Search Ads organizations this company can spend from",
5084
+ "description": "Query metrics for any level of the account over a date range\n\nOne row per entity, already aggregated server-side and sorted by --order-by, so a top-N question is one\ncall with --order-by and --page-size N — never sum pages yourself. Account-level totals are one call to\nasa metrics overview instead. The date window is capped by the finest --group-by period: 28 days when\nday is grouped, 90 with no period grouping, 180 by week, 365 by month and coarser — widen the window by\ncoarsening the grouping, not by splitting into more calls. Each page is also capped at a breakdown-row\ncount (entities × countries × periods); over it the call fails with 422 cli_response_too_large naming the\npage[size] that fits — coarsen the grouping, narrow the window, or reduce page[size].\n\nMoney columns are in the campaign group currency, not USD, and spend and local_spend carry the same\nfigure; the currency itself comes from asa orgs list. Rate budgets and the breakdown-row cap are set per\ncompany: read the current ones with asa whoami rather than assuming a default. meta.pagination.count is\nthe full entity count behind the filters, so take inventory from there instead of counting the rows on a\npage. meta.max_valid_day says how many days the youngest cohort in the window has lived — any --by-days\nwindow above it repeats the last real figure because that time has not passed yet, so treat those as\nunreached rather than as a plateau.\n\n--metric is required and every metric named is computed over the whole entity set, so ask for the\ncolumns you actually read. subscribers and paid_subscribers (and arppu / arpas, which derive from them)\ncount unique profiles per entity and cost roughly seventeen times the rest; whatever the --entity, they\nare refused unless --campaign or --ad-group scopes the call. Those scope flags are also the cheapest way\nto make any call fast, since cost follows the number of entities aggregated, not the page size.",
5339
5085
  "examples": [
5340
- "<%= config.bin %> asa orgs list"
5086
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric adapty_installs",
5087
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --order-by spend --page-size 5",
5088
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --group-by country --page-size 1000",
5089
+ "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric roas",
5090
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric roas --by-days 7 --by-days 90",
5091
+ "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric arpas --campaign 0f0e..."
5092
+ ],
5093
+ "flags": {
5094
+ "json": {
5095
+ "description": "Format output as json.",
5096
+ "helpGroup": "GLOBAL",
5097
+ "name": "json",
5098
+ "allowNo": false,
5099
+ "type": "boolean"
5100
+ },
5101
+ "page": {
5102
+ "description": "Page number",
5103
+ "name": "page",
5104
+ "default": 1,
5105
+ "hasDynamicHelp": false,
5106
+ "multiple": false,
5107
+ "type": "option"
5108
+ },
5109
+ "page-size": {
5110
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
5111
+ "name": "page-size",
5112
+ "default": 100,
5113
+ "hasDynamicHelp": false,
5114
+ "multiple": false,
5115
+ "type": "option"
5116
+ },
5117
+ "by-days": {
5118
+ "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
5119
+ "name": "by-days",
5120
+ "hasDynamicHelp": false,
5121
+ "multiple": true,
5122
+ "type": "option"
5123
+ },
5124
+ "ad-group": {
5125
+ "description": "Keep only rows in this ad group; repeatable",
5126
+ "name": "ad-group",
5127
+ "hasDynamicHelp": false,
5128
+ "multiple": true,
5129
+ "type": "option"
5130
+ },
5131
+ "app": {
5132
+ "description": "Keep only rows in this app; repeatable",
5133
+ "name": "app",
5134
+ "hasDynamicHelp": false,
5135
+ "multiple": true,
5136
+ "type": "option"
5137
+ },
5138
+ "campaign": {
5139
+ "description": "Keep only rows in this campaign; repeatable",
5140
+ "name": "campaign",
5141
+ "hasDynamicHelp": false,
5142
+ "multiple": true,
5143
+ "type": "option"
5144
+ },
5145
+ "date-from": {
5146
+ "description": "Start of the period (YYYY-MM-DD)",
5147
+ "name": "date-from",
5148
+ "required": true,
5149
+ "hasDynamicHelp": false,
5150
+ "multiple": false,
5151
+ "type": "option"
5152
+ },
5153
+ "date-to": {
5154
+ "description": "End of the period (YYYY-MM-DD)",
5155
+ "name": "date-to",
5156
+ "required": true,
5157
+ "hasDynamicHelp": false,
5158
+ "multiple": false,
5159
+ "type": "option"
5160
+ },
5161
+ "entity": {
5162
+ "description": "What to report on",
5163
+ "name": "entity",
5164
+ "required": true,
5165
+ "hasDynamicHelp": false,
5166
+ "multiple": false,
5167
+ "options": [
5168
+ "ad",
5169
+ "ad-group",
5170
+ "campaign",
5171
+ "keyword"
5172
+ ],
5173
+ "type": "option"
5174
+ },
5175
+ "group-by": {
5176
+ "description": "Break the rows down by a dimension, repeatable",
5177
+ "name": "group-by",
5178
+ "hasDynamicHelp": false,
5179
+ "multiple": true,
5180
+ "options": [
5181
+ "country",
5182
+ "day",
5183
+ "month",
5184
+ "quarter",
5185
+ "week",
5186
+ "year"
5187
+ ],
5188
+ "type": "option"
5189
+ },
5190
+ "metric": {
5191
+ "description": "Metric name (dashboard nomenclature, e.g. spend, taps, gross_roas), repeatable and required; every metric asked for is computed over the whole entity set, so list only what you read; a wrong name fails listing all valid ones",
5192
+ "name": "metric",
5193
+ "required": true,
5194
+ "hasDynamicHelp": false,
5195
+ "multiple": true,
5196
+ "type": "option"
5197
+ },
5198
+ "order": {
5199
+ "description": "Sort direction",
5200
+ "name": "order",
5201
+ "default": "desc",
5202
+ "hasDynamicHelp": false,
5203
+ "multiple": false,
5204
+ "options": [
5205
+ "asc",
5206
+ "desc"
5207
+ ],
5208
+ "type": "option"
5209
+ },
5210
+ "order-by": {
5211
+ "description": "Metric or field to sort by; cohort metrics rank via their gross_/proceeds_/net_ names",
5212
+ "name": "order-by",
5213
+ "hasDynamicHelp": false,
5214
+ "multiple": false,
5215
+ "type": "option"
5216
+ },
5217
+ "order-by-day": {
5218
+ "description": "Rank by a cohort metric at this renewal window; must be one of the --by-days values",
5219
+ "name": "order-by-day",
5220
+ "hasDynamicHelp": false,
5221
+ "multiple": false,
5222
+ "type": "option"
5223
+ }
5224
+ },
5225
+ "hasDynamicHelp": false,
5226
+ "hiddenAliases": [],
5227
+ "id": "asa:metrics",
5228
+ "pluginAlias": "adapty",
5229
+ "pluginName": "adapty",
5230
+ "pluginType": "core",
5231
+ "strict": true,
5232
+ "enableJsonFlag": true,
5233
+ "isESM": true,
5234
+ "relativePath": [
5235
+ "dist",
5236
+ "commands",
5237
+ "asa",
5238
+ "metrics",
5239
+ "index.js"
5240
+ ]
5241
+ },
5242
+ "asa:metrics:overview": {
5243
+ "aliases": [],
5244
+ "args": {},
5245
+ "description": "Totals for a period, optionally split into day, week or month buckets\n\nThe one-call answer to \"how much did I spend / earn overall\" and to any single-period trend question:\ntotals for the whole entity level plus a per-period series, no pagination, no client-side summing. The\ndate window is capped by --period-unit: 90 days at day, 180 by week, 365 by month and coarser. Shares\nthe 5-per-minute metrics budget with asa metrics.",
5246
+ "examples": [
5247
+ "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
5248
+ "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --period-unit WEEK"
5341
5249
  ],
5342
5250
  "flags": {
5343
5251
  "json": {
@@ -5347,26 +5255,179 @@
5347
5255
  "allowNo": false,
5348
5256
  "type": "boolean"
5349
5257
  },
5350
- "page": {
5351
- "description": "Page number",
5352
- "name": "page",
5353
- "default": 1,
5258
+ "by-days": {
5259
+ "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
5260
+ "name": "by-days",
5261
+ "hasDynamicHelp": false,
5262
+ "multiple": true,
5263
+ "type": "option"
5264
+ },
5265
+ "date-from": {
5266
+ "description": "Start of the period (YYYY-MM-DD)",
5267
+ "name": "date-from",
5268
+ "required": true,
5269
+ "hasDynamicHelp": false,
5270
+ "multiple": false,
5271
+ "type": "option"
5272
+ },
5273
+ "date-to": {
5274
+ "description": "End of the period (YYYY-MM-DD)",
5275
+ "name": "date-to",
5276
+ "required": true,
5277
+ "hasDynamicHelp": false,
5278
+ "multiple": false,
5279
+ "type": "option"
5280
+ },
5281
+ "entity": {
5282
+ "description": "What to report on",
5283
+ "name": "entity",
5284
+ "required": true,
5285
+ "hasDynamicHelp": false,
5286
+ "multiple": false,
5287
+ "options": [
5288
+ "ad",
5289
+ "ad-group",
5290
+ "campaign",
5291
+ "keyword"
5292
+ ],
5293
+ "type": "option"
5294
+ },
5295
+ "metric": {
5296
+ "description": "Metric name, repeatable; cohort roots only here (revenue, roas, arpu), not their gross_/proceeds_/net_ variants; omit for every metric",
5297
+ "name": "metric",
5298
+ "hasDynamicHelp": false,
5299
+ "multiple": true,
5300
+ "type": "option"
5301
+ },
5302
+ "period-unit": {
5303
+ "description": "Bucket size",
5304
+ "name": "period-unit",
5305
+ "default": "day",
5306
+ "hasDynamicHelp": false,
5307
+ "multiple": false,
5308
+ "options": [
5309
+ "day",
5310
+ "month",
5311
+ "quarter",
5312
+ "week",
5313
+ "year"
5314
+ ],
5315
+ "type": "option"
5316
+ }
5317
+ },
5318
+ "hasDynamicHelp": false,
5319
+ "hiddenAliases": [],
5320
+ "id": "asa:metrics:overview",
5321
+ "pluginAlias": "adapty",
5322
+ "pluginName": "adapty",
5323
+ "pluginType": "core",
5324
+ "strict": true,
5325
+ "enableJsonFlag": true,
5326
+ "isESM": true,
5327
+ "relativePath": [
5328
+ "dist",
5329
+ "commands",
5330
+ "asa",
5331
+ "metrics",
5332
+ "overview.js"
5333
+ ]
5334
+ },
5335
+ "asa:negative-keywords:add": {
5336
+ "aliases": [],
5337
+ "args": {},
5338
+ "description": "Add negative keywords to an ad group or across a campaign",
5339
+ "examples": [
5340
+ "<%= config.bin %> asa negative-keywords add --ad-group UUID --text \"free\"",
5341
+ "<%= config.bin %> asa negative-keywords add --campaign UUID --text \"free\" --text \"cheap\"",
5342
+ "<%= config.bin %> asa negative-keywords add --campaign UUID --all-ad-groups --text \"free\""
5343
+ ],
5344
+ "flags": {
5345
+ "json": {
5346
+ "description": "Format output as json.",
5347
+ "helpGroup": "GLOBAL",
5348
+ "name": "json",
5349
+ "allowNo": false,
5350
+ "type": "boolean"
5351
+ },
5352
+ "yes": {
5353
+ "char": "y",
5354
+ "description": "Apply without asking; required when the output is piped or --json is used",
5355
+ "name": "yes",
5356
+ "allowNo": false,
5357
+ "type": "boolean"
5358
+ },
5359
+ "idempotency-key": {
5360
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
5361
+ "name": "idempotency-key",
5362
+ "hasDynamicHelp": false,
5363
+ "multiple": false,
5364
+ "type": "option"
5365
+ },
5366
+ "ad-group": {
5367
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
5368
+ "exclusive": [
5369
+ "campaign"
5370
+ ],
5371
+ "name": "ad-group",
5372
+ "hasDynamicHelp": false,
5373
+ "multiple": false,
5374
+ "type": "option"
5375
+ },
5376
+ "all-ad-groups": {
5377
+ "dependsOn": [
5378
+ "campaign"
5379
+ ],
5380
+ "description": "Apply to every ad group of the campaign instead of the campaign itself",
5381
+ "name": "all-ad-groups",
5382
+ "allowNo": false,
5383
+ "type": "boolean"
5384
+ },
5385
+ "campaign": {
5386
+ "description": "Campaign ID (UUID)",
5387
+ "exclusive": [
5388
+ "ad-group"
5389
+ ],
5390
+ "name": "campaign",
5391
+ "hasDynamicHelp": false,
5392
+ "multiple": false,
5393
+ "type": "option"
5394
+ },
5395
+ "match-type": {
5396
+ "description": "Match type",
5397
+ "name": "match-type",
5398
+ "default": "EXACT",
5354
5399
  "hasDynamicHelp": false,
5355
5400
  "multiple": false,
5401
+ "options": [
5402
+ "BROAD",
5403
+ "EXACT"
5404
+ ],
5356
5405
  "type": "option"
5357
5406
  },
5358
- "page-size": {
5359
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
5360
- "name": "page-size",
5361
- "default": 100,
5407
+ "status": {
5408
+ "description": "Keyword status",
5409
+ "name": "status",
5410
+ "default": "ACTIVE",
5362
5411
  "hasDynamicHelp": false,
5363
5412
  "multiple": false,
5413
+ "options": [
5414
+ "ACTIVE",
5415
+ "PAUSED"
5416
+ ],
5417
+ "type": "option"
5418
+ },
5419
+ "text": {
5420
+ "description": "Keyword text, repeatable",
5421
+ "name": "text",
5422
+ "required": true,
5423
+ "hasDynamicHelp": false,
5424
+ "multiple": true,
5364
5425
  "type": "option"
5365
5426
  }
5366
5427
  },
5367
5428
  "hasDynamicHelp": false,
5368
5429
  "hiddenAliases": [],
5369
- "id": "asa:orgs:list",
5430
+ "id": "asa:negative-keywords:add",
5370
5431
  "pluginAlias": "adapty",
5371
5432
  "pluginName": "adapty",
5372
5433
  "pluginType": "core",
@@ -5377,17 +5438,17 @@
5377
5438
  "dist",
5378
5439
  "commands",
5379
5440
  "asa",
5380
- "orgs",
5381
- "list.js"
5441
+ "negative-keywords",
5442
+ "add.js"
5382
5443
  ]
5383
5444
  },
5384
- "asa:search-terms:list": {
5445
+ "asa:negative-keywords:list": {
5385
5446
  "aliases": [],
5386
5447
  "args": {},
5387
- "description": "List the search terms your ads matched, with their metrics",
5448
+ "description": "List negative keywords; ad_group_id is empty for campaign-level ones",
5388
5449
  "examples": [
5389
- "<%= config.bin %> asa search-terms list --date-from 2026-07-01 --date-to 2026-07-31",
5390
- "<%= config.bin %> asa search-terms list --ad-group AD_GROUP_UUID"
5450
+ "<%= config.bin %> asa negative-keywords list",
5451
+ "<%= config.bin %> asa negative-keywords list --campaign CAMPAIGN_UUID"
5391
5452
  ],
5392
5453
  "flags": {
5393
5454
  "json": {
@@ -5413,20 +5474,6 @@
5413
5474
  "multiple": false,
5414
5475
  "type": "option"
5415
5476
  },
5416
- "date-from": {
5417
- "description": "Start of the reporting period (YYYY-MM-DD), defaults to today",
5418
- "name": "date-from",
5419
- "hasDynamicHelp": false,
5420
- "multiple": false,
5421
- "type": "option"
5422
- },
5423
- "date-to": {
5424
- "description": "End of the reporting period (YYYY-MM-DD), defaults to today",
5425
- "name": "date-to",
5426
- "hasDynamicHelp": false,
5427
- "multiple": false,
5428
- "type": "option"
5429
- },
5430
5477
  "app": {
5431
5478
  "description": "Keep only rows in this app; repeatable",
5432
5479
  "name": "app",
@@ -5461,11 +5508,17 @@
5461
5508
  "hasDynamicHelp": false,
5462
5509
  "multiple": true,
5463
5510
  "type": "option"
5511
+ },
5512
+ "campaign-level-only": {
5513
+ "description": "Keep only campaign-level rows (ad_group_id is null)",
5514
+ "name": "campaign-level-only",
5515
+ "allowNo": false,
5516
+ "type": "boolean"
5464
5517
  }
5465
5518
  },
5466
5519
  "hasDynamicHelp": false,
5467
5520
  "hiddenAliases": [],
5468
- "id": "asa:search-terms:list",
5521
+ "id": "asa:negative-keywords:list",
5469
5522
  "pluginAlias": "adapty",
5470
5523
  "pluginName": "adapty",
5471
5524
  "pluginType": "core",
@@ -5476,17 +5529,16 @@
5476
5529
  "dist",
5477
5530
  "commands",
5478
5531
  "asa",
5479
- "search-terms",
5532
+ "negative-keywords",
5480
5533
  "list.js"
5481
5534
  ]
5482
5535
  },
5483
- "asa:product-pages:list": {
5536
+ "asa:orgs:list": {
5484
5537
  "aliases": [],
5485
5538
  "args": {},
5486
- "description": "List custom product pages (read-only; authoring stays in App Store Connect)",
5539
+ "description": "List the Apple Search Ads organizations this company can spend from",
5487
5540
  "examples": [
5488
- "<%= config.bin %> asa product-pages list",
5489
- "<%= config.bin %> asa product-pages list --app APP_UUID"
5541
+ "<%= config.bin %> asa orgs list"
5490
5542
  ],
5491
5543
  "flags": {
5492
5544
  "json": {
@@ -5511,25 +5563,11 @@
5511
5563
  "hasDynamicHelp": false,
5512
5564
  "multiple": false,
5513
5565
  "type": "option"
5514
- },
5515
- "app": {
5516
- "description": "Keep only rows in this app; repeatable",
5517
- "name": "app",
5518
- "hasDynamicHelp": false,
5519
- "multiple": true,
5520
- "type": "option"
5521
- },
5522
- "campaign-group": {
5523
- "description": "Keep only rows in this campaign group; repeatable",
5524
- "name": "campaign-group",
5525
- "hasDynamicHelp": false,
5526
- "multiple": true,
5527
- "type": "option"
5528
5566
  }
5529
5567
  },
5530
5568
  "hasDynamicHelp": false,
5531
5569
  "hiddenAliases": [],
5532
- "id": "asa:product-pages:list",
5570
+ "id": "asa:orgs:list",
5533
5571
  "pluginAlias": "adapty",
5534
5572
  "pluginName": "adapty",
5535
5573
  "pluginType": "core",
@@ -5540,17 +5578,17 @@
5540
5578
  "dist",
5541
5579
  "commands",
5542
5580
  "asa",
5543
- "product-pages",
5581
+ "orgs",
5544
5582
  "list.js"
5545
5583
  ]
5546
5584
  },
5547
- "asa:product-pages:sync": {
5585
+ "asa:product-pages:list": {
5548
5586
  "aliases": [],
5549
5587
  "args": {},
5550
- "description": "Refresh custom product pages from Apple",
5588
+ "description": "List custom product pages (read-only; authoring stays in App Store Connect)",
5551
5589
  "examples": [
5552
- "<%= config.bin %> asa product-pages sync",
5553
- "<%= config.bin %> asa product-pages sync --adam-id 123456"
5590
+ "<%= config.bin %> asa product-pages list",
5591
+ "<%= config.bin %> asa product-pages list --app APP_UUID"
5554
5592
  ],
5555
5593
  "flags": {
5556
5594
  "json": {
@@ -5560,31 +5598,40 @@
5560
5598
  "allowNo": false,
5561
5599
  "type": "boolean"
5562
5600
  },
5563
- "yes": {
5564
- "char": "y",
5565
- "description": "Apply without asking; required when the output is piped or --json is used",
5566
- "name": "yes",
5567
- "allowNo": false,
5568
- "type": "boolean"
5569
- },
5570
- "idempotency-key": {
5571
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
5572
- "name": "idempotency-key",
5601
+ "page": {
5602
+ "description": "Page number",
5603
+ "name": "page",
5604
+ "default": 1,
5573
5605
  "hasDynamicHelp": false,
5574
5606
  "multiple": false,
5575
5607
  "type": "option"
5576
5608
  },
5577
- "adam-id": {
5578
- "description": "Limit the refresh to one app; omit to cover every app",
5579
- "name": "adam-id",
5609
+ "page-size": {
5610
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
5611
+ "name": "page-size",
5612
+ "default": 100,
5580
5613
  "hasDynamicHelp": false,
5581
5614
  "multiple": false,
5582
5615
  "type": "option"
5616
+ },
5617
+ "app": {
5618
+ "description": "Keep only rows in this app; repeatable",
5619
+ "name": "app",
5620
+ "hasDynamicHelp": false,
5621
+ "multiple": true,
5622
+ "type": "option"
5623
+ },
5624
+ "campaign-group": {
5625
+ "description": "Keep only rows in this campaign group; repeatable",
5626
+ "name": "campaign-group",
5627
+ "hasDynamicHelp": false,
5628
+ "multiple": true,
5629
+ "type": "option"
5583
5630
  }
5584
5631
  },
5585
5632
  "hasDynamicHelp": false,
5586
5633
  "hiddenAliases": [],
5587
- "id": "asa:product-pages:sync",
5634
+ "id": "asa:product-pages:list",
5588
5635
  "pluginAlias": "adapty",
5589
5636
  "pluginName": "adapty",
5590
5637
  "pluginType": "core",
@@ -5596,17 +5643,16 @@
5596
5643
  "commands",
5597
5644
  "asa",
5598
5645
  "product-pages",
5599
- "sync.js"
5646
+ "list.js"
5600
5647
  ]
5601
5648
  },
5602
- "asa:negative-keywords:add": {
5649
+ "asa:product-pages:sync": {
5603
5650
  "aliases": [],
5604
5651
  "args": {},
5605
- "description": "Add negative keywords to an ad group or across a campaign",
5652
+ "description": "Refresh custom product pages from Apple",
5606
5653
  "examples": [
5607
- "<%= config.bin %> asa negative-keywords add --ad-group UUID --text \"free\"",
5608
- "<%= config.bin %> asa negative-keywords add --campaign UUID --text \"free\" --text \"cheap\"",
5609
- "<%= config.bin %> asa negative-keywords add --campaign UUID --all-ad-groups --text \"free\""
5654
+ "<%= config.bin %> asa product-pages sync",
5655
+ "<%= config.bin %> asa product-pages sync --adam-id 123456"
5610
5656
  ],
5611
5657
  "flags": {
5612
5658
  "json": {
@@ -5630,71 +5676,17 @@
5630
5676
  "multiple": false,
5631
5677
  "type": "option"
5632
5678
  },
5633
- "ad-group": {
5634
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
5635
- "exclusive": [
5636
- "campaign"
5637
- ],
5638
- "name": "ad-group",
5639
- "hasDynamicHelp": false,
5640
- "multiple": false,
5641
- "type": "option"
5642
- },
5643
- "all-ad-groups": {
5644
- "dependsOn": [
5645
- "campaign"
5646
- ],
5647
- "description": "Apply to every ad group of the campaign instead of the campaign itself",
5648
- "name": "all-ad-groups",
5649
- "allowNo": false,
5650
- "type": "boolean"
5651
- },
5652
- "campaign": {
5653
- "description": "Campaign ID (UUID)",
5654
- "exclusive": [
5655
- "ad-group"
5656
- ],
5657
- "name": "campaign",
5658
- "hasDynamicHelp": false,
5659
- "multiple": false,
5660
- "type": "option"
5661
- },
5662
- "match-type": {
5663
- "description": "Match type",
5664
- "name": "match-type",
5665
- "default": "EXACT",
5666
- "hasDynamicHelp": false,
5667
- "multiple": false,
5668
- "options": [
5669
- "BROAD",
5670
- "EXACT"
5671
- ],
5672
- "type": "option"
5673
- },
5674
- "status": {
5675
- "description": "Keyword status",
5676
- "name": "status",
5677
- "default": "ACTIVE",
5679
+ "adam-id": {
5680
+ "description": "Limit the refresh to one app; omit to cover every app",
5681
+ "name": "adam-id",
5678
5682
  "hasDynamicHelp": false,
5679
5683
  "multiple": false,
5680
- "options": [
5681
- "ACTIVE",
5682
- "PAUSED"
5683
- ],
5684
- "type": "option"
5685
- },
5686
- "text": {
5687
- "description": "Keyword text, repeatable",
5688
- "name": "text",
5689
- "required": true,
5690
- "hasDynamicHelp": false,
5691
- "multiple": true,
5692
5684
  "type": "option"
5693
5685
  }
5694
5686
  },
5695
5687
  "hasDynamicHelp": false,
5696
5688
  "hiddenAliases": [],
5697
- "id": "asa:negative-keywords:add",
5689
+ "id": "asa:product-pages:sync",
5698
5690
  "pluginAlias": "adapty",
5699
5691
  "pluginName": "adapty",
5700
5692
  "pluginType": "core",
@@ -5705,17 +5697,17 @@
5705
5697
  "dist",
5706
5698
  "commands",
5707
5699
  "asa",
5708
- "negative-keywords",
5709
- "add.js"
5700
+ "product-pages",
5701
+ "sync.js"
5710
5702
  ]
5711
5703
  },
5712
- "asa:negative-keywords:list": {
5704
+ "asa:search-terms:list": {
5713
5705
  "aliases": [],
5714
5706
  "args": {},
5715
- "description": "List negative keywords; ad_group_id is empty for campaign-level ones",
5707
+ "description": "List the search terms your ads matched, with their metrics",
5716
5708
  "examples": [
5717
- "<%= config.bin %> asa negative-keywords list",
5718
- "<%= config.bin %> asa negative-keywords list --campaign CAMPAIGN_UUID"
5709
+ "<%= config.bin %> asa search-terms list --date-from 2026-07-01 --date-to 2026-07-31",
5710
+ "<%= config.bin %> asa search-terms list --ad-group AD_GROUP_UUID"
5719
5711
  ],
5720
5712
  "flags": {
5721
5713
  "json": {
@@ -5741,6 +5733,20 @@
5741
5733
  "multiple": false,
5742
5734
  "type": "option"
5743
5735
  },
5736
+ "date-from": {
5737
+ "description": "Start of the reporting period (YYYY-MM-DD), defaults to today",
5738
+ "name": "date-from",
5739
+ "hasDynamicHelp": false,
5740
+ "multiple": false,
5741
+ "type": "option"
5742
+ },
5743
+ "date-to": {
5744
+ "description": "End of the reporting period (YYYY-MM-DD), defaults to today",
5745
+ "name": "date-to",
5746
+ "hasDynamicHelp": false,
5747
+ "multiple": false,
5748
+ "type": "option"
5749
+ },
5744
5750
  "app": {
5745
5751
  "description": "Keep only rows in this app; repeatable",
5746
5752
  "name": "app",
@@ -5775,17 +5781,11 @@
5775
5781
  "hasDynamicHelp": false,
5776
5782
  "multiple": true,
5777
5783
  "type": "option"
5778
- },
5779
- "campaign-level-only": {
5780
- "description": "Keep only campaign-level rows (ad_group_id is null)",
5781
- "name": "campaign-level-only",
5782
- "allowNo": false,
5783
- "type": "boolean"
5784
5784
  }
5785
5785
  },
5786
5786
  "hasDynamicHelp": false,
5787
5787
  "hiddenAliases": [],
5788
- "id": "asa:negative-keywords:list",
5788
+ "id": "asa:search-terms:list",
5789
5789
  "pluginAlias": "adapty",
5790
5790
  "pluginName": "adapty",
5791
5791
  "pluginType": "core",
@@ -5796,7 +5796,7 @@
5796
5796
  "dist",
5797
5797
  "commands",
5798
5798
  "asa",
5799
- "negative-keywords",
5799
+ "search-terms",
5800
5800
  "list.js"
5801
5801
  ]
5802
5802
  },
@@ -6104,5 +6104,5 @@
6104
6104
  ]
6105
6105
  }
6106
6106
  },
6107
- "version": "0.9.0"
6107
+ "version": "0.9.1"
6108
6108
  }