adapty 0.8.3-beta.1 → 0.8.3

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.
Files changed (37) hide show
  1. package/README.md +132 -2
  2. package/dist/commands/asa/ad-groups/create.js +1 -1
  3. package/dist/commands/asa/ad-groups/update.js +1 -1
  4. package/dist/commands/asa/ads/create.js +1 -1
  5. package/dist/commands/asa/ads/update.js +1 -1
  6. package/dist/commands/asa/automations/create.d.ts +9 -0
  7. package/dist/commands/asa/automations/create.js +19 -3
  8. package/dist/commands/asa/automations/run.js +1 -1
  9. package/dist/commands/asa/automations/update.d.ts +9 -0
  10. package/dist/commands/asa/automations/update.js +22 -6
  11. package/dist/commands/asa/campaigns/bulk-create.js +1 -1
  12. package/dist/commands/asa/campaigns/create.js +1 -1
  13. package/dist/commands/asa/campaigns/update.js +1 -1
  14. package/dist/commands/asa/keywords/add.js +1 -1
  15. package/dist/commands/asa/keywords/update.js +1 -1
  16. package/dist/commands/asa/metrics/index.d.ts +4 -1
  17. package/dist/commands/asa/metrics/index.js +18 -8
  18. package/dist/commands/asa/negative-keywords/add.js +1 -1
  19. package/dist/commands/asa/product-pages/sync.js +1 -1
  20. package/dist/commands/placements/create.js +3 -18
  21. package/dist/commands/placements/update.js +3 -18
  22. package/dist/lib/api-schemas.d.ts +1 -10
  23. package/dist/lib/asa-flags.d.ts +24 -0
  24. package/dist/lib/asa-flags.js +54 -0
  25. package/dist/lib/asa-keyword-action.d.ts +18 -0
  26. package/dist/lib/asa-keyword-action.js +160 -0
  27. package/dist/lib/errors.js +2 -1
  28. package/oclif.manifest.json +1353 -1290
  29. package/package.json +2 -3
  30. package/dist/commands/flows/publish.d.ts +0 -15
  31. package/dist/commands/flows/publish.js +0 -47
  32. package/dist/commands/flows/update.d.ts +0 -15
  33. package/dist/commands/flows/update.js +0 -28
  34. package/dist/lib/placement-audiences.d.ts +0 -6
  35. package/dist/lib/placement-audiences.js +0 -25
  36. /package/dist/lib/{confirm.d.ts → asa-confirm.d.ts} +0 -0
  37. /package/dist/lib/{confirm.js → asa-confirm.js} +0 -0
@@ -425,85 +425,6 @@
425
425
  "update.js"
426
426
  ]
427
427
  },
428
- "asa:connect": {
429
- "aliases": [],
430
- "args": {},
431
- "description": "Connect an Apple Search Ads account to this company",
432
- "examples": [
433
- "<%= config.bin %> asa connect",
434
- "<%= config.bin %> asa connect --no-wait"
435
- ],
436
- "flags": {
437
- "json": {
438
- "description": "Format output as json.",
439
- "helpGroup": "GLOBAL",
440
- "name": "json",
441
- "allowNo": false,
442
- "type": "boolean"
443
- },
444
- "timeout": {
445
- "description": "Seconds to wait for the browser step",
446
- "name": "timeout",
447
- "default": 300,
448
- "hasDynamicHelp": false,
449
- "multiple": false,
450
- "type": "option"
451
- },
452
- "wait": {
453
- "description": "Wait until Apple Ads reports as connected",
454
- "name": "wait",
455
- "allowNo": true,
456
- "type": "boolean"
457
- }
458
- },
459
- "hasDynamicHelp": false,
460
- "hiddenAliases": [],
461
- "id": "asa:connect",
462
- "pluginAlias": "adapty",
463
- "pluginName": "adapty",
464
- "pluginType": "core",
465
- "strict": true,
466
- "enableJsonFlag": true,
467
- "isESM": true,
468
- "relativePath": [
469
- "dist",
470
- "commands",
471
- "asa",
472
- "connect.js"
473
- ]
474
- },
475
- "asa:whoami": {
476
- "aliases": [],
477
- "args": {},
478
- "description": "Show which company the token unlocks and whether Apple Ads is connected",
479
- "examples": [
480
- "<%= config.bin %> asa whoami"
481
- ],
482
- "flags": {
483
- "json": {
484
- "description": "Format output as json.",
485
- "helpGroup": "GLOBAL",
486
- "name": "json",
487
- "allowNo": false,
488
- "type": "boolean"
489
- }
490
- },
491
- "hasDynamicHelp": false,
492
- "hiddenAliases": [],
493
- "id": "asa:whoami",
494
- "pluginAlias": "adapty",
495
- "pluginName": "adapty",
496
- "pluginType": "core",
497
- "strict": true,
498
- "enableJsonFlag": true,
499
- "isESM": true,
500
- "relativePath": [
501
- "dist",
502
- "commands",
503
- "asa",
504
- "whoami.js"
505
- ]
506
- },
507
428
  "auth:login": {
508
429
  "aliases": [],
509
430
  "args": {},
@@ -656,12 +577,13 @@
656
577
  "whoami.js"
657
578
  ]
658
579
  },
659
- "flows:create": {
580
+ "asa:connect": {
660
581
  "aliases": [],
661
582
  "args": {},
662
- "description": "Create a flow (row only — write its config with `flows config update`)",
583
+ "description": "Connect an Apple Search Ads account to this company",
663
584
  "examples": [
664
- "<%= config.bin %> flows create --app UUID --name \"Onboarding\""
585
+ "<%= config.bin %> asa connect",
586
+ "<%= config.bin %> asa connect --no-wait"
665
587
  ],
666
588
  "flags": {
667
589
  "json": {
@@ -671,26 +593,24 @@
671
593
  "allowNo": false,
672
594
  "type": "boolean"
673
595
  },
674
- "app": {
675
- "description": "App ID (UUID)",
676
- "name": "app",
677
- "required": true,
596
+ "timeout": {
597
+ "description": "Seconds to wait for the browser step",
598
+ "name": "timeout",
599
+ "default": 300,
678
600
  "hasDynamicHelp": false,
679
601
  "multiple": false,
680
602
  "type": "option"
681
603
  },
682
- "name": {
683
- "description": "Flow name",
684
- "name": "name",
685
- "required": true,
686
- "hasDynamicHelp": false,
687
- "multiple": false,
688
- "type": "option"
604
+ "wait": {
605
+ "description": "Wait until Apple Ads reports as connected",
606
+ "name": "wait",
607
+ "allowNo": true,
608
+ "type": "boolean"
689
609
  }
690
610
  },
691
611
  "hasDynamicHelp": false,
692
612
  "hiddenAliases": [],
693
- "id": "flows:create",
613
+ "id": "asa:connect",
694
614
  "pluginAlias": "adapty",
695
615
  "pluginName": "adapty",
696
616
  "pluginType": "core",
@@ -700,22 +620,16 @@
700
620
  "relativePath": [
701
621
  "dist",
702
622
  "commands",
703
- "flows",
704
- "create.js"
623
+ "asa",
624
+ "connect.js"
705
625
  ]
706
626
  },
707
- "flows:get": {
627
+ "asa:whoami": {
708
628
  "aliases": [],
709
- "args": {
710
- "flow_id": {
711
- "description": "Flow ID (UUID)",
712
- "name": "flow_id",
713
- "required": true
714
- }
715
- },
716
- "description": "Get flow details",
629
+ "args": {},
630
+ "description": "Show which company the token unlocks and whether Apple Ads is connected",
717
631
  "examples": [
718
- "<%= config.bin %> flows get --app UUID 550e8400-e29b-41d4-a716-446655440000"
632
+ "<%= config.bin %> asa whoami"
719
633
  ],
720
634
  "flags": {
721
635
  "json": {
@@ -724,19 +638,11 @@
724
638
  "name": "json",
725
639
  "allowNo": false,
726
640
  "type": "boolean"
727
- },
728
- "app": {
729
- "description": "App ID (UUID)",
730
- "name": "app",
731
- "required": true,
732
- "hasDynamicHelp": false,
733
- "multiple": false,
734
- "type": "option"
735
641
  }
736
642
  },
737
643
  "hasDynamicHelp": false,
738
644
  "hiddenAliases": [],
739
- "id": "flows:get",
645
+ "id": "asa:whoami",
740
646
  "pluginAlias": "adapty",
741
647
  "pluginName": "adapty",
742
648
  "pluginType": "core",
@@ -746,16 +652,16 @@
746
652
  "relativePath": [
747
653
  "dist",
748
654
  "commands",
749
- "flows",
750
- "get.js"
655
+ "asa",
656
+ "whoami.js"
751
657
  ]
752
658
  },
753
- "flows:list": {
659
+ "flows:create": {
754
660
  "aliases": [],
755
661
  "args": {},
756
- "description": "List flows for an app",
662
+ "description": "Create a flow (row only — write its config with `flows config update`)",
757
663
  "examples": [
758
- "<%= config.bin %> flows list --app 550e8400-..."
664
+ "<%= config.bin %> flows create --app UUID --name \"Onboarding\""
759
665
  ],
760
666
  "flags": {
761
667
  "json": {
@@ -773,18 +679,10 @@
773
679
  "multiple": false,
774
680
  "type": "option"
775
681
  },
776
- "page": {
777
- "description": "Page number",
778
- "name": "page",
779
- "default": 1,
780
- "hasDynamicHelp": false,
781
- "multiple": false,
782
- "type": "option"
783
- },
784
- "page-size": {
785
- "description": "Items per page (max 100)",
786
- "name": "page-size",
787
- "default": 20,
682
+ "name": {
683
+ "description": "Flow name",
684
+ "name": "name",
685
+ "required": true,
788
686
  "hasDynamicHelp": false,
789
687
  "multiple": false,
790
688
  "type": "option"
@@ -792,7 +690,7 @@
792
690
  },
793
691
  "hasDynamicHelp": false,
794
692
  "hiddenAliases": [],
795
- "id": "flows:list",
693
+ "id": "flows:create",
796
694
  "pluginAlias": "adapty",
797
695
  "pluginName": "adapty",
798
696
  "pluginType": "core",
@@ -803,10 +701,10 @@
803
701
  "dist",
804
702
  "commands",
805
703
  "flows",
806
- "list.js"
704
+ "create.js"
807
705
  ]
808
706
  },
809
- "flows:publish": {
707
+ "flows:get": {
810
708
  "aliases": [],
811
709
  "args": {
812
710
  "flow_id": {
@@ -815,9 +713,9 @@
815
713
  "required": true
816
714
  }
817
715
  },
818
- "description": "Publish a flow (async — publication completes in the background)",
716
+ "description": "Get flow details",
819
717
  "examples": [
820
- "<%= config.bin %> flows publish --app UUID 550e8400-e29b-41d4-a716-446655440000"
718
+ "<%= config.bin %> flows get --app UUID 550e8400-e29b-41d4-a716-446655440000"
821
719
  ],
822
720
  "flags": {
823
721
  "json": {
@@ -834,18 +732,11 @@
834
732
  "hasDynamicHelp": false,
835
733
  "multiple": false,
836
734
  "type": "option"
837
- },
838
- "yes": {
839
- "char": "y",
840
- "description": "Apply without asking; required when the output is piped or --json is used",
841
- "name": "yes",
842
- "allowNo": false,
843
- "type": "boolean"
844
735
  }
845
736
  },
846
737
  "hasDynamicHelp": false,
847
738
  "hiddenAliases": [],
848
- "id": "flows:publish",
739
+ "id": "flows:get",
849
740
  "pluginAlias": "adapty",
850
741
  "pluginName": "adapty",
851
742
  "pluginType": "core",
@@ -856,21 +747,15 @@
856
747
  "dist",
857
748
  "commands",
858
749
  "flows",
859
- "publish.js"
750
+ "get.js"
860
751
  ]
861
752
  },
862
- "flows:update": {
753
+ "flows:list": {
863
754
  "aliases": [],
864
- "args": {
865
- "flow_id": {
866
- "description": "Flow ID (UUID)",
867
- "name": "flow_id",
868
- "required": true
869
- }
870
- },
871
- "description": "Rename a flow",
755
+ "args": {},
756
+ "description": "List flows for an app",
872
757
  "examples": [
873
- "<%= config.bin %> flows update --app UUID 550e8400-e29b-41d4-a716-446655440000 --name \"Onboarding v2\""
758
+ "<%= config.bin %> flows list --app 550e8400-..."
874
759
  ],
875
760
  "flags": {
876
761
  "json": {
@@ -888,10 +773,18 @@
888
773
  "multiple": false,
889
774
  "type": "option"
890
775
  },
891
- "name": {
892
- "description": "New flow name",
893
- "name": "name",
894
- "required": true,
776
+ "page": {
777
+ "description": "Page number",
778
+ "name": "page",
779
+ "default": 1,
780
+ "hasDynamicHelp": false,
781
+ "multiple": false,
782
+ "type": "option"
783
+ },
784
+ "page-size": {
785
+ "description": "Items per page (max 100)",
786
+ "name": "page-size",
787
+ "default": 20,
895
788
  "hasDynamicHelp": false,
896
789
  "multiple": false,
897
790
  "type": "option"
@@ -899,7 +792,7 @@
899
792
  },
900
793
  "hasDynamicHelp": false,
901
794
  "hiddenAliases": [],
902
- "id": "flows:update",
795
+ "id": "flows:list",
903
796
  "pluginAlias": "adapty",
904
797
  "pluginName": "adapty",
905
798
  "pluginType": "core",
@@ -910,7 +803,7 @@
910
803
  "dist",
911
804
  "commands",
912
805
  "flows",
913
- "update.js"
806
+ "list.js"
914
807
  ]
915
808
  },
916
809
  "paywalls:create": {
@@ -1184,8 +1077,7 @@
1184
1077
  "args": {},
1185
1078
  "description": "Create a placement with a paywall",
1186
1079
  "examples": [
1187
- "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"paywall\",\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1188
- "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"flow\",\"segment_ids\":[],\"flow_id\":\"FLOW_UUID\",\"priority\":0}]'",
1080
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1189
1081
  "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
1190
1082
  ],
1191
1083
  "flags": {
@@ -1205,7 +1097,7 @@
1205
1097
  "type": "option"
1206
1098
  },
1207
1099
  "audiences": {
1208
- "description": "JSON array of audience entries. Every entry needs an explicit content_type. Paywall: {content_type:\"paywall\", segment_ids, paywall_id, priority}. Flow: {content_type:\"flow\", segment_ids, flow_id, priority}. A flow must be published first (flows publish) — attaching a draft flow returns 400.",
1100
+ "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1209
1101
  "name": "audiences",
1210
1102
  "hasDynamicHelp": false,
1211
1103
  "multiple": false,
@@ -1364,8 +1256,7 @@
1364
1256
  },
1365
1257
  "description": "Update a placement",
1366
1258
  "examples": [
1367
- "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"paywall\",\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1368
- "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"flow\",\"segment_ids\":[],\"flow_id\":\"FLOW_UUID\",\"priority\":0}]'",
1259
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1369
1260
  "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
1370
1261
  ],
1371
1262
  "flags": {
@@ -1385,7 +1276,7 @@
1385
1276
  "type": "option"
1386
1277
  },
1387
1278
  "audiences": {
1388
- "description": "JSON array of audience entries. Every entry needs an explicit content_type. Paywall: {content_type:\"paywall\", segment_ids, paywall_id, priority}. Flow: {content_type:\"flow\", segment_ids, flow_id, priority}. A flow must be published first (flows publish) — attaching a draft flow returns 400.",
1279
+ "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1389
1280
  "name": "audiences",
1390
1281
  "hasDynamicHelp": false,
1391
1282
  "multiple": false,
@@ -2198,13 +2089,12 @@
2198
2089
  "update.js"
2199
2090
  ]
2200
2091
  },
2201
- "asa:apps:list": {
2092
+ "asa:ads:create": {
2202
2093
  "aliases": [],
2203
2094
  "args": {},
2204
- "description": "List the apps promoted by this company in Apple Search Ads",
2095
+ "description": "Create an ad from a creative in an ad group",
2205
2096
  "examples": [
2206
- "<%= config.bin %> asa apps list",
2207
- "<%= config.bin %> asa apps list --page 2 --page-size 50"
2097
+ "<%= config.bin %> asa ads create --ad-group UUID --creative-id 4321 --name \"Summer ad\""
2208
2098
  ],
2209
2099
  "flags": {
2210
2100
  "json": {
@@ -2214,73 +2104,24 @@
2214
2104
  "allowNo": false,
2215
2105
  "type": "boolean"
2216
2106
  },
2217
- "page": {
2218
- "description": "Page number",
2219
- "name": "page",
2220
- "default": 1,
2107
+ "yes": {
2108
+ "char": "y",
2109
+ "description": "Apply without asking; required when the output is piped or --json is used",
2110
+ "name": "yes",
2111
+ "allowNo": false,
2112
+ "type": "boolean"
2113
+ },
2114
+ "idempotency-key": {
2115
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2116
+ "name": "idempotency-key",
2221
2117
  "hasDynamicHelp": false,
2222
2118
  "multiple": false,
2223
2119
  "type": "option"
2224
2120
  },
2225
- "page-size": {
2226
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2227
- "name": "page-size",
2228
- "default": 100,
2229
- "hasDynamicHelp": false,
2230
- "multiple": false,
2231
- "type": "option"
2232
- }
2233
- },
2234
- "hasDynamicHelp": false,
2235
- "hiddenAliases": [],
2236
- "id": "asa:apps:list",
2237
- "pluginAlias": "adapty",
2238
- "pluginName": "adapty",
2239
- "pluginType": "core",
2240
- "strict": true,
2241
- "enableJsonFlag": true,
2242
- "isESM": true,
2243
- "relativePath": [
2244
- "dist",
2245
- "commands",
2246
- "asa",
2247
- "apps",
2248
- "list.js"
2249
- ]
2250
- },
2251
- "asa:ads:create": {
2252
- "aliases": [],
2253
- "args": {},
2254
- "description": "Create an ad from a creative in an ad group",
2255
- "examples": [
2256
- "<%= config.bin %> asa ads create --ad-group UUID --creative-id 4321 --name \"Summer ad\""
2257
- ],
2258
- "flags": {
2259
- "json": {
2260
- "description": "Format output as json.",
2261
- "helpGroup": "GLOBAL",
2262
- "name": "json",
2263
- "allowNo": false,
2264
- "type": "boolean"
2265
- },
2266
- "yes": {
2267
- "char": "y",
2268
- "description": "Apply without asking; required when the output is piped or --json is used",
2269
- "name": "yes",
2270
- "allowNo": false,
2271
- "type": "boolean"
2272
- },
2273
- "idempotency-key": {
2274
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2275
- "name": "idempotency-key",
2276
- "hasDynamicHelp": false,
2277
- "multiple": false,
2278
- "type": "option"
2279
- },
2280
- "ad-group": {
2281
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
2282
- "name": "ad-group",
2283
- "required": true,
2121
+ "ad-group": {
2122
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
2123
+ "name": "ad-group",
2124
+ "required": true,
2284
2125
  "hasDynamicHelp": false,
2285
2126
  "multiple": false,
2286
2127
  "type": "option"
@@ -2529,15 +2370,13 @@
2529
2370
  "update.js"
2530
2371
  ]
2531
2372
  },
2532
- "asa:campaigns:bulk-create": {
2373
+ "asa:apps:list": {
2533
2374
  "aliases": [],
2534
2375
  "args": {},
2535
- "description": "Create a whole campaign structure (campaigns → ad groups → keywords/negative keywords/ads) in one bulk operation",
2376
+ "description": "List the apps promoted by this company in Apple Search Ads",
2536
2377
  "examples": [
2537
- "<%= config.bin %> asa campaigns bulk-create --file structure.json",
2538
- "cat structure.json | <%= config.bin %> asa campaigns bulk-create --file -",
2539
- "<%= config.bin %> asa campaigns bulk-create --from-file Campaign_And_Adgroup_Template.xlsx --org-id 1234567",
2540
- "<%= config.bin %> asa campaigns bulk-create --from-file keywords_template.csv --org-id 1234567 --preview"
2378
+ "<%= config.bin %> asa apps list",
2379
+ "<%= config.bin %> asa apps list --page 2 --page-size 50"
2541
2380
  ],
2542
2381
  "flags": {
2543
2382
  "json": {
@@ -2547,73 +2386,26 @@
2547
2386
  "allowNo": false,
2548
2387
  "type": "boolean"
2549
2388
  },
2550
- "yes": {
2551
- "char": "y",
2552
- "description": "Apply without asking; required when the output is piped or --json is used",
2553
- "name": "yes",
2554
- "allowNo": false,
2555
- "type": "boolean"
2556
- },
2557
- "idempotency-key": {
2558
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2559
- "name": "idempotency-key",
2560
- "hasDynamicHelp": false,
2561
- "multiple": false,
2562
- "type": "option"
2563
- },
2564
- "file": {
2565
- "description": "JSON file with the campaign structure (the POST /bulk-operations/ body); use \"-\" for stdin",
2566
- "name": "file",
2567
- "hasDynamicHelp": false,
2568
- "multiple": false,
2569
- "type": "option"
2570
- },
2571
- "from-file": {
2572
- "description": "Apple Ads bulk template (Campaign_And_Adgroup_Template.xlsx or keywords .csv) to convert and submit",
2573
- "name": "from-file",
2574
- "hasDynamicHelp": false,
2575
- "multiple": false,
2576
- "type": "option"
2577
- },
2578
- "org-id": {
2579
- "description": "Apple org id (campaign_group_id) the converted template will target; required with --from-file",
2580
- "name": "org-id",
2581
- "hasDynamicHelp": false,
2582
- "multiple": false,
2583
- "type": "option"
2584
- },
2585
- "poll-interval": {
2586
- "description": "Seconds between progress polls",
2587
- "name": "poll-interval",
2588
- "default": 5,
2389
+ "page": {
2390
+ "description": "Page number",
2391
+ "name": "page",
2392
+ "default": 1,
2589
2393
  "hasDynamicHelp": false,
2590
2394
  "multiple": false,
2591
2395
  "type": "option"
2592
2396
  },
2593
- "preview": {
2594
- "description": "With --from-file: print the converted request and stop, nothing is created",
2595
- "name": "preview",
2596
- "allowNo": false,
2597
- "type": "boolean"
2598
- },
2599
- "timeout": {
2600
- "description": "Max seconds to wait for the operation to finish",
2601
- "name": "timeout",
2602
- "default": 900,
2397
+ "page-size": {
2398
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2399
+ "name": "page-size",
2400
+ "default": 100,
2603
2401
  "hasDynamicHelp": false,
2604
2402
  "multiple": false,
2605
2403
  "type": "option"
2606
- },
2607
- "wait": {
2608
- "description": "Poll the operation until it finishes; --no-wait returns the operation id immediately",
2609
- "name": "wait",
2610
- "allowNo": true,
2611
- "type": "boolean"
2612
2404
  }
2613
2405
  },
2614
2406
  "hasDynamicHelp": false,
2615
2407
  "hiddenAliases": [],
2616
- "id": "asa:campaigns:bulk-create",
2408
+ "id": "asa:apps:list",
2617
2409
  "pluginAlias": "adapty",
2618
2410
  "pluginName": "adapty",
2619
2411
  "pluginType": "core",
@@ -2624,18 +2416,19 @@
2624
2416
  "dist",
2625
2417
  "commands",
2626
2418
  "asa",
2627
- "campaigns",
2628
- "bulk-create.js"
2419
+ "apps",
2420
+ "list.js"
2629
2421
  ]
2630
2422
  },
2631
- "asa:campaigns:bulk-list": {
2423
+ "asa:automations:create": {
2632
2424
  "aliases": [],
2633
2425
  "args": {},
2634
- "description": "This company's bulk operations, newest first; inspect one with bulk-status",
2426
+ "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.",
2635
2427
  "examples": [
2636
- "<%= config.bin %> asa campaigns bulk-list",
2637
- "<%= config.bin %> asa campaigns bulk-list --status partial --status failed",
2638
- "<%= config.bin %> asa campaigns bulk-list --created-from 2026-08-01 --created-to 2026-08-20"
2428
+ "<%= config.bin %> asa automations create --file rule.json",
2429
+ "<%= config.bin %> asa automations create --file rule.json --run-now",
2430
+ "<%= config.bin %> asa automations create --file rule.json --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type search_term_current_cpt",
2431
+ "<%= 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"
2639
2432
  ],
2640
2433
  "flags": {
2641
2434
  "json": {
@@ -2645,61 +2438,111 @@
2645
2438
  "allowNo": false,
2646
2439
  "type": "boolean"
2647
2440
  },
2648
- "page": {
2649
- "description": "Page number",
2650
- "name": "page",
2651
- "default": 1,
2441
+ "cpt-bid": {
2442
+ "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",
2443
+ "name": "cpt-bid",
2652
2444
  "hasDynamicHelp": false,
2653
2445
  "multiple": false,
2654
2446
  "type": "option"
2655
2447
  },
2656
- "page-size": {
2657
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2658
- "name": "page-size",
2659
- "default": 100,
2448
+ "cpt-bid-type": {
2449
+ "description": "Where the bid of the created keyword comes from; the API has no default",
2450
+ "name": "cpt-bid-type",
2660
2451
  "hasDynamicHelp": false,
2661
2452
  "multiple": false,
2453
+ "options": [
2454
+ "ad_group_default_bid",
2455
+ "keyword_current_bid",
2456
+ "search_term_current_cpt",
2457
+ "set_to"
2458
+ ],
2662
2459
  "type": "option"
2663
2460
  },
2664
- "app": {
2665
- "description": "Keep only operations of this app (UUID)",
2666
- "name": "app",
2461
+ "match-type": {
2462
+ "description": "Match type of the created keyword; the API has no default",
2463
+ "name": "match-type",
2667
2464
  "hasDynamicHelp": false,
2668
2465
  "multiple": false,
2466
+ "options": [
2467
+ "BROAD",
2468
+ "EXACT"
2469
+ ],
2669
2470
  "type": "option"
2670
2471
  },
2671
- "created-from": {
2672
- "description": "Keep only operations created on or after this date (YYYY-MM-DD)",
2673
- "name": "created-from",
2472
+ "negate": {
2473
+ "description": "Also add the search term as a negative keyword at this level (search-term rules)",
2474
+ "exclusive": [
2475
+ "no-negate"
2476
+ ],
2477
+ "name": "negate",
2674
2478
  "hasDynamicHelp": false,
2675
2479
  "multiple": false,
2480
+ "options": [
2481
+ "ad-group",
2482
+ "campaign"
2483
+ ],
2676
2484
  "type": "option"
2677
2485
  },
2678
- "created-to": {
2679
- "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
2680
- "name": "created-to",
2486
+ "no-negate": {
2487
+ "description": "Leave no negative keyword behind (search-term rules)",
2488
+ "exclusive": [
2489
+ "negate"
2490
+ ],
2491
+ "name": "no-negate",
2492
+ "allowNo": false,
2493
+ "type": "boolean"
2494
+ },
2495
+ "pause-original": {
2496
+ "description": "Pause the source keyword in its own ad group (targeting-keyword rules)",
2497
+ "name": "pause-original",
2498
+ "allowNo": true,
2499
+ "type": "boolean"
2500
+ },
2501
+ "skip-enable-duplicates": {
2502
+ "description": "Skip a keyword that already exists in the target ad group instead of enabling it (search-term rules)",
2503
+ "name": "skip-enable-duplicates",
2504
+ "allowNo": true,
2505
+ "type": "boolean"
2506
+ },
2507
+ "target-ad-group": {
2508
+ "description": "Ad group the keyword is added to (UUID), repeatable; a rule without one does nothing",
2509
+ "name": "target-ad-group",
2510
+ "hasDynamicHelp": false,
2511
+ "multiple": true,
2512
+ "type": "option"
2513
+ },
2514
+ "yes": {
2515
+ "char": "y",
2516
+ "description": "Apply without asking; required when the output is piped or --json is used",
2517
+ "name": "yes",
2518
+ "allowNo": false,
2519
+ "type": "boolean"
2520
+ },
2521
+ "idempotency-key": {
2522
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2523
+ "name": "idempotency-key",
2681
2524
  "hasDynamicHelp": false,
2682
2525
  "multiple": false,
2683
2526
  "type": "option"
2684
2527
  },
2685
- "status": {
2686
- "description": "Keep only operations in this state; repeatable",
2687
- "name": "status",
2528
+ "file": {
2529
+ "description": "JSON file with the rule body, or - to read stdin",
2530
+ "name": "file",
2531
+ "required": true,
2688
2532
  "hasDynamicHelp": false,
2689
- "multiple": true,
2690
- "options": [
2691
- "failed",
2692
- "partial",
2693
- "pending",
2694
- "running",
2695
- "success"
2696
- ],
2533
+ "multiple": false,
2697
2534
  "type": "option"
2535
+ },
2536
+ "run-now": {
2537
+ "description": "Queue the first run right after the rule is stored",
2538
+ "name": "run-now",
2539
+ "allowNo": false,
2540
+ "type": "boolean"
2698
2541
  }
2699
2542
  },
2700
2543
  "hasDynamicHelp": false,
2701
2544
  "hiddenAliases": [],
2702
- "id": "asa:campaigns:bulk-list",
2545
+ "id": "asa:automations:create",
2703
2546
  "pluginAlias": "adapty",
2704
2547
  "pluginName": "adapty",
2705
2548
  "pluginType": "core",
@@ -2710,22 +2553,22 @@
2710
2553
  "dist",
2711
2554
  "commands",
2712
2555
  "asa",
2713
- "campaigns",
2714
- "bulk-list.js"
2556
+ "automations",
2557
+ "create.js"
2715
2558
  ]
2716
2559
  },
2717
- "asa:campaigns:bulk-status": {
2560
+ "asa:automations:get": {
2718
2561
  "aliases": [],
2719
2562
  "args": {
2720
- "operation-id": {
2721
- "description": "Bulk operation ID returned by bulk-create",
2722
- "name": "operation-id",
2563
+ "automation_id": {
2564
+ "description": "Automation rule ID (UUID)",
2565
+ "name": "automation_id",
2723
2566
  "required": true
2724
2567
  }
2725
2568
  },
2726
- "description": "Progress board of one bulk operation: counts, pipelines and the per-object log",
2569
+ "description": "Show one automation rule with its conditions and actions",
2727
2570
  "examples": [
2728
- "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
2571
+ "<%= config.bin %> asa automations get 550e8400-e29b-41d4-a716-446655440000"
2729
2572
  ],
2730
2573
  "flags": {
2731
2574
  "json": {
@@ -2734,27 +2577,11 @@
2734
2577
  "name": "json",
2735
2578
  "allowNo": false,
2736
2579
  "type": "boolean"
2737
- },
2738
- "page": {
2739
- "description": "Page number",
2740
- "name": "page",
2741
- "default": 1,
2742
- "hasDynamicHelp": false,
2743
- "multiple": false,
2744
- "type": "option"
2745
- },
2746
- "page-size": {
2747
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2748
- "name": "page-size",
2749
- "default": 100,
2750
- "hasDynamicHelp": false,
2751
- "multiple": false,
2752
- "type": "option"
2753
2580
  }
2754
2581
  },
2755
2582
  "hasDynamicHelp": false,
2756
2583
  "hiddenAliases": [],
2757
- "id": "asa:campaigns:bulk-status",
2584
+ "id": "asa:automations:get",
2758
2585
  "pluginAlias": "adapty",
2759
2586
  "pluginName": "adapty",
2760
2587
  "pluginType": "core",
@@ -2765,18 +2592,16 @@
2765
2592
  "dist",
2766
2593
  "commands",
2767
2594
  "asa",
2768
- "campaigns",
2769
- "bulk-status.js"
2595
+ "automations",
2596
+ "get.js"
2770
2597
  ]
2771
2598
  },
2772
- "asa:campaigns:create": {
2599
+ "asa:automations:list": {
2773
2600
  "aliases": [],
2774
2601
  "args": {},
2775
- "description": "Create a campaign in Apple Search Ads. A Max Conversions campaign also needs an automated ad group (`asa ad-groups create --automated`); line-of-credit organizations must pass all five --invoice-* flags",
2602
+ "description": "List automation rules; status 1 is active, 0 is stopped",
2776
2603
  "examples": [
2777
- "<%= config.bin %> asa campaigns create --org UUID --name \"Winter push\" --adam-id 123456 --country US --daily-budget 50",
2778
- "<%= config.bin %> asa campaigns create --org UUID --name \"Max Conv\" --adam-id 123456 --country US --daily-budget 50 --bidding-strategy MAX_CONVERSIONS",
2779
- "<%= config.bin %> asa campaigns create --org UUID --name \"LOC push\" --adam-id 123456 --country US --daily-budget 50 --invoice-advertiser \"Acme Inc\" --invoice-order-number PO-42 --invoice-contact-name \"Jane Doe\" --invoice-contact-email jane@acme.com --invoice-billing-email billing@acme.com"
2604
+ "<%= config.bin %> asa automations list"
2780
2605
  ],
2781
2606
  "flags": {
2782
2607
  "json": {
@@ -2786,169 +2611,18 @@
2786
2611
  "allowNo": false,
2787
2612
  "type": "boolean"
2788
2613
  },
2789
- "currency": {
2790
- "description": "Currency code for the amounts in this call",
2791
- "name": "currency",
2792
- "default": "USD",
2614
+ "page": {
2615
+ "description": "Page number",
2616
+ "name": "page",
2617
+ "default": 1,
2793
2618
  "hasDynamicHelp": false,
2794
2619
  "multiple": false,
2795
2620
  "type": "option"
2796
2621
  },
2797
- "yes": {
2798
- "char": "y",
2799
- "description": "Apply without asking; required when the output is piped or --json is used",
2800
- "name": "yes",
2801
- "allowNo": false,
2802
- "type": "boolean"
2803
- },
2804
- "idempotency-key": {
2805
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2806
- "name": "idempotency-key",
2807
- "hasDynamicHelp": false,
2808
- "multiple": false,
2809
- "type": "option"
2810
- },
2811
- "invoice-advertiser": {
2812
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
2813
- "name": "invoice-advertiser",
2814
- "hasDynamicHelp": false,
2815
- "multiple": false,
2816
- "type": "option"
2817
- },
2818
- "invoice-billing-email": {
2819
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): billing contact email",
2820
- "name": "invoice-billing-email",
2821
- "hasDynamicHelp": false,
2822
- "multiple": false,
2823
- "type": "option"
2824
- },
2825
- "invoice-contact-email": {
2826
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact email",
2827
- "name": "invoice-contact-email",
2828
- "hasDynamicHelp": false,
2829
- "multiple": false,
2830
- "type": "option"
2831
- },
2832
- "invoice-contact-name": {
2833
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact name",
2834
- "name": "invoice-contact-name",
2835
- "hasDynamicHelp": false,
2836
- "multiple": false,
2837
- "type": "option"
2838
- },
2839
- "invoice-order-number": {
2840
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): order number",
2841
- "name": "invoice-order-number",
2842
- "hasDynamicHelp": false,
2843
- "multiple": false,
2844
- "type": "option"
2845
- },
2846
- "ad-channel-type": {
2847
- "description": "Ad channel type",
2848
- "name": "ad-channel-type",
2849
- "default": "SEARCH",
2850
- "hasDynamicHelp": false,
2851
- "multiple": false,
2852
- "options": [
2853
- "DISPLAY",
2854
- "SEARCH"
2855
- ],
2856
- "type": "option"
2857
- },
2858
- "adam-id": {
2859
- "description": "App Store app ID (adam_id)",
2860
- "name": "adam-id",
2861
- "required": true,
2862
- "hasDynamicHelp": false,
2863
- "multiple": false,
2864
- "type": "option"
2865
- },
2866
- "bidding-strategy": {
2867
- "description": "Bidding strategy; Apple defaults to MANUAL_CPT when omitted",
2868
- "name": "bidding-strategy",
2869
- "hasDynamicHelp": false,
2870
- "multiple": false,
2871
- "options": [
2872
- "MANUAL_CPT",
2873
- "MAX_CONVERSIONS"
2874
- ],
2875
- "type": "option"
2876
- },
2877
- "billing-event": {
2878
- "description": "Billing event",
2879
- "name": "billing-event",
2880
- "default": "TAPS",
2881
- "hasDynamicHelp": false,
2882
- "multiple": false,
2883
- "options": [
2884
- "IMPRESSIONS",
2885
- "TAPS"
2886
- ],
2887
- "type": "option"
2888
- },
2889
- "budget": {
2890
- "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
2891
- "name": "budget",
2892
- "hasDynamicHelp": false,
2893
- "multiple": false,
2894
- "type": "option"
2895
- },
2896
- "country": {
2897
- "description": "Country or region code, repeatable",
2898
- "name": "country",
2899
- "required": true,
2900
- "hasDynamicHelp": false,
2901
- "multiple": true,
2902
- "type": "option"
2903
- },
2904
- "daily-budget": {
2905
- "description": "Daily budget (amount, e.g. 50 or 12.50)",
2906
- "name": "daily-budget",
2907
- "required": true,
2908
- "hasDynamicHelp": false,
2909
- "multiple": false,
2910
- "type": "option"
2911
- },
2912
- "name": {
2913
- "description": "Campaign name",
2914
- "name": "name",
2915
- "required": true,
2916
- "hasDynamicHelp": false,
2917
- "multiple": false,
2918
- "type": "option"
2919
- },
2920
- "org": {
2921
- "description": "Campaign group ID (UUID) — see `adapty asa orgs list`",
2922
- "name": "org",
2923
- "required": true,
2924
- "hasDynamicHelp": false,
2925
- "multiple": false,
2926
- "type": "option"
2927
- },
2928
- "status": {
2929
- "description": "Initial status",
2930
- "name": "status",
2931
- "hasDynamicHelp": false,
2932
- "multiple": false,
2933
- "options": [
2934
- "ENABLED",
2935
- "PAUSED"
2936
- ],
2937
- "type": "option"
2938
- },
2939
- "supply-source": {
2940
- "description": "Supply source, repeatable",
2941
- "name": "supply-source",
2942
- "default": [
2943
- "APPSTORE_SEARCH_RESULTS"
2944
- ],
2945
- "hasDynamicHelp": false,
2946
- "multiple": true,
2947
- "type": "option"
2948
- },
2949
- "target-cpa": {
2950
- "description": "Target CPA; must be lower than --daily-budget (amount, e.g. 50 or 12.50)",
2951
- "name": "target-cpa",
2622
+ "page-size": {
2623
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2624
+ "name": "page-size",
2625
+ "default": 100,
2952
2626
  "hasDynamicHelp": false,
2953
2627
  "multiple": false,
2954
2628
  "type": "option"
@@ -2956,7 +2630,7 @@
2956
2630
  },
2957
2631
  "hasDynamicHelp": false,
2958
2632
  "hiddenAliases": [],
2959
- "id": "asa:campaigns:create",
2633
+ "id": "asa:automations:list",
2960
2634
  "pluginAlias": "adapty",
2961
2635
  "pluginName": "adapty",
2962
2636
  "pluginType": "core",
@@ -2967,22 +2641,23 @@
2967
2641
  "dist",
2968
2642
  "commands",
2969
2643
  "asa",
2970
- "campaigns",
2971
- "create.js"
2644
+ "automations",
2645
+ "list.js"
2972
2646
  ]
2973
2647
  },
2974
- "asa:campaigns:get": {
2648
+ "asa:automations:run": {
2975
2649
  "aliases": [],
2976
2650
  "args": {
2977
- "campaign_id": {
2978
- "description": "Campaign ID (UUID)",
2979
- "name": "campaign_id",
2651
+ "automation_id": {
2652
+ "description": "Automation rule ID (UUID)",
2653
+ "name": "automation_id",
2980
2654
  "required": true
2981
2655
  }
2982
2656
  },
2983
- "description": "Show one campaign; read numbers with asa metrics",
2657
+ "description": "Run an automation rule now; the run is queued, not awaited",
2984
2658
  "examples": [
2985
- "<%= config.bin %> asa campaigns get 550e8400-e29b-41d4-a716-446655440000"
2659
+ "<%= config.bin %> asa automations run UUID",
2660
+ "<%= config.bin %> asa automations run UUID --dry-run"
2986
2661
  ],
2987
2662
  "flags": {
2988
2663
  "json": {
@@ -2991,11 +2666,31 @@
2991
2666
  "name": "json",
2992
2667
  "allowNo": false,
2993
2668
  "type": "boolean"
2669
+ },
2670
+ "yes": {
2671
+ "char": "y",
2672
+ "description": "Apply without asking; required when the output is piped or --json is used",
2673
+ "name": "yes",
2674
+ "allowNo": false,
2675
+ "type": "boolean"
2676
+ },
2677
+ "idempotency-key": {
2678
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2679
+ "name": "idempotency-key",
2680
+ "hasDynamicHelp": false,
2681
+ "multiple": false,
2682
+ "type": "option"
2683
+ },
2684
+ "dry-run": {
2685
+ "description": "Evaluate and log the rule without touching Apple",
2686
+ "name": "dry-run",
2687
+ "allowNo": false,
2688
+ "type": "boolean"
2994
2689
  }
2995
2690
  },
2996
2691
  "hasDynamicHelp": false,
2997
2692
  "hiddenAliases": [],
2998
- "id": "asa:campaigns:get",
2693
+ "id": "asa:automations:run",
2999
2694
  "pluginAlias": "adapty",
3000
2695
  "pluginName": "adapty",
3001
2696
  "pluginType": "core",
@@ -3006,17 +2701,22 @@
3006
2701
  "dist",
3007
2702
  "commands",
3008
2703
  "asa",
3009
- "campaigns",
3010
- "get.js"
2704
+ "automations",
2705
+ "run.js"
3011
2706
  ]
3012
2707
  },
3013
- "asa:campaigns:list": {
2708
+ "asa:automations:runs": {
3014
2709
  "aliases": [],
3015
- "args": {},
3016
- "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
2710
+ "args": {
2711
+ "automation_id": {
2712
+ "description": "Automation rule ID (UUID)",
2713
+ "name": "automation_id",
2714
+ "required": true
2715
+ }
2716
+ },
2717
+ "description": "List past runs of an automation rule, including dry runs",
3017
2718
  "examples": [
3018
- "<%= config.bin %> asa campaigns list",
3019
- "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
2719
+ "<%= config.bin %> asa automations runs 550e8400-e29b-41d4-a716-446655440000"
3020
2720
  ],
3021
2721
  "flags": {
3022
2722
  "json": {
@@ -3041,43 +2741,11 @@
3041
2741
  "hasDynamicHelp": false,
3042
2742
  "multiple": false,
3043
2743
  "type": "option"
3044
- },
3045
- "app": {
3046
- "description": "Keep only rows in this app; repeatable",
3047
- "name": "app",
3048
- "hasDynamicHelp": false,
3049
- "multiple": true,
3050
- "type": "option"
3051
- },
3052
- "campaign-group": {
3053
- "description": "Keep only rows in this campaign group; repeatable",
3054
- "name": "campaign-group",
3055
- "hasDynamicHelp": false,
3056
- "multiple": true,
3057
- "type": "option"
3058
- },
3059
- "search": {
3060
- "description": "Case-insensitive substring match on the name",
3061
- "name": "search",
3062
- "hasDynamicHelp": false,
3063
- "multiple": false,
3064
- "type": "option"
3065
- },
3066
- "status": {
3067
- "description": "Keep only rows in this state",
3068
- "name": "status",
3069
- "hasDynamicHelp": false,
3070
- "multiple": false,
3071
- "options": [
3072
- "ENABLED",
3073
- "PAUSED"
3074
- ],
3075
- "type": "option"
3076
2744
  }
3077
2745
  },
3078
2746
  "hasDynamicHelp": false,
3079
2747
  "hiddenAliases": [],
3080
- "id": "asa:campaigns:list",
2748
+ "id": "asa:automations:runs",
3081
2749
  "pluginAlias": "adapty",
3082
2750
  "pluginName": "adapty",
3083
2751
  "pluginType": "core",
@@ -3088,24 +2756,24 @@
3088
2756
  "dist",
3089
2757
  "commands",
3090
2758
  "asa",
3091
- "campaigns",
3092
- "list.js"
2759
+ "automations",
2760
+ "runs.js"
3093
2761
  ]
3094
2762
  },
3095
- "asa:campaigns:update": {
2763
+ "asa:automations:update": {
3096
2764
  "aliases": [],
3097
2765
  "args": {
3098
- "campaign_id": {
3099
- "description": "Campaign ID (UUID)",
3100
- "name": "campaign_id",
2766
+ "automation_id": {
2767
+ "description": "Automation rule ID (UUID)",
2768
+ "name": "automation_id",
3101
2769
  "required": true
3102
2770
  }
3103
2771
  },
3104
- "description": "Change a campaign: budgets, countries, status, schedule or Invoicing Options (all five --invoice-* flags together; they replace the stored set)",
2772
+ "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.",
3105
2773
  "examples": [
3106
- "<%= config.bin %> asa campaigns update UUID --status PAUSED",
3107
- "<%= config.bin %> asa campaigns update UUID --daily-budget 80",
3108
- "<%= config.bin %> asa campaigns update UUID --invoice-advertiser \"Acme Inc\" --invoice-order-number PO-42 --invoice-contact-name \"Jane Doe\" --invoice-contact-email jane@acme.com --invoice-billing-email billing@acme.com"
2774
+ "<%= config.bin %> asa automations update UUID --stop",
2775
+ "<%= config.bin %> asa automations update UUID --file rule.json",
2776
+ "<%= config.bin %> asa automations update UUID --target-ad-group AD_GROUP_ID --match-type EXACT --cpt-bid-type search_term_current_cpt"
3109
2777
  ],
3110
2778
  "flags": {
3111
2779
  "json": {
@@ -3115,124 +2783,228 @@
3115
2783
  "allowNo": false,
3116
2784
  "type": "boolean"
3117
2785
  },
3118
- "currency": {
3119
- "description": "Currency code for the amounts in this call",
3120
- "name": "currency",
3121
- "default": "USD",
2786
+ "cpt-bid": {
2787
+ "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",
2788
+ "name": "cpt-bid",
3122
2789
  "hasDynamicHelp": false,
3123
2790
  "multiple": false,
3124
2791
  "type": "option"
3125
2792
  },
3126
- "yes": {
3127
- "char": "y",
3128
- "description": "Apply without asking; required when the output is piped or --json is used",
3129
- "name": "yes",
3130
- "allowNo": false,
3131
- "type": "boolean"
3132
- },
3133
- "idempotency-key": {
3134
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3135
- "name": "idempotency-key",
2793
+ "cpt-bid-type": {
2794
+ "description": "Where the bid of the created keyword comes from; the API has no default",
2795
+ "name": "cpt-bid-type",
3136
2796
  "hasDynamicHelp": false,
3137
2797
  "multiple": false,
2798
+ "options": [
2799
+ "ad_group_default_bid",
2800
+ "keyword_current_bid",
2801
+ "search_term_current_cpt",
2802
+ "set_to"
2803
+ ],
3138
2804
  "type": "option"
3139
2805
  },
3140
- "invoice-advertiser": {
3141
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
3142
- "name": "invoice-advertiser",
2806
+ "match-type": {
2807
+ "description": "Match type of the created keyword; the API has no default",
2808
+ "name": "match-type",
3143
2809
  "hasDynamicHelp": false,
3144
2810
  "multiple": false,
2811
+ "options": [
2812
+ "BROAD",
2813
+ "EXACT"
2814
+ ],
3145
2815
  "type": "option"
3146
2816
  },
3147
- "invoice-billing-email": {
3148
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): billing contact email",
3149
- "name": "invoice-billing-email",
2817
+ "negate": {
2818
+ "description": "Also add the search term as a negative keyword at this level (search-term rules)",
2819
+ "exclusive": [
2820
+ "no-negate"
2821
+ ],
2822
+ "name": "negate",
3150
2823
  "hasDynamicHelp": false,
3151
2824
  "multiple": false,
2825
+ "options": [
2826
+ "ad-group",
2827
+ "campaign"
2828
+ ],
3152
2829
  "type": "option"
3153
2830
  },
3154
- "invoice-contact-email": {
3155
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact email",
3156
- "name": "invoice-contact-email",
2831
+ "no-negate": {
2832
+ "description": "Leave no negative keyword behind (search-term rules)",
2833
+ "exclusive": [
2834
+ "negate"
2835
+ ],
2836
+ "name": "no-negate",
2837
+ "allowNo": false,
2838
+ "type": "boolean"
2839
+ },
2840
+ "pause-original": {
2841
+ "description": "Pause the source keyword in its own ad group (targeting-keyword rules)",
2842
+ "name": "pause-original",
2843
+ "allowNo": true,
2844
+ "type": "boolean"
2845
+ },
2846
+ "skip-enable-duplicates": {
2847
+ "description": "Skip a keyword that already exists in the target ad group instead of enabling it (search-term rules)",
2848
+ "name": "skip-enable-duplicates",
2849
+ "allowNo": true,
2850
+ "type": "boolean"
2851
+ },
2852
+ "target-ad-group": {
2853
+ "description": "Ad group the keyword is added to (UUID), repeatable; a rule without one does nothing",
2854
+ "name": "target-ad-group",
3157
2855
  "hasDynamicHelp": false,
3158
- "multiple": false,
2856
+ "multiple": true,
3159
2857
  "type": "option"
3160
2858
  },
3161
- "invoice-contact-name": {
3162
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact name",
3163
- "name": "invoice-contact-name",
2859
+ "yes": {
2860
+ "char": "y",
2861
+ "description": "Apply without asking; required when the output is piped or --json is used",
2862
+ "name": "yes",
2863
+ "allowNo": false,
2864
+ "type": "boolean"
2865
+ },
2866
+ "idempotency-key": {
2867
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2868
+ "name": "idempotency-key",
3164
2869
  "hasDynamicHelp": false,
3165
2870
  "multiple": false,
3166
2871
  "type": "option"
3167
2872
  },
3168
- "invoice-order-number": {
3169
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): order number",
3170
- "name": "invoice-order-number",
2873
+ "file": {
2874
+ "description": "JSON file with the parts to change, or - to read stdin",
2875
+ "name": "file",
3171
2876
  "hasDynamicHelp": false,
3172
2877
  "multiple": false,
3173
2878
  "type": "option"
3174
2879
  },
3175
- "bidding-strategy": {
3176
- "description": "Bidding strategy",
3177
- "name": "bidding-strategy",
2880
+ "name": {
2881
+ "description": "Rule name",
2882
+ "name": "name",
3178
2883
  "hasDynamicHelp": false,
3179
2884
  "multiple": false,
3180
- "options": [
3181
- "MANUAL_CPT",
3182
- "MAX_CONVERSIONS"
3183
- ],
3184
2885
  "type": "option"
3185
2886
  },
3186
- "budget": {
3187
- "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
3188
- "name": "budget",
2887
+ "start": {
2888
+ "description": "Activate the rule",
2889
+ "exclusive": [
2890
+ "stop"
2891
+ ],
2892
+ "name": "start",
2893
+ "allowNo": false,
2894
+ "type": "boolean"
2895
+ },
2896
+ "stop": {
2897
+ "description": "Stop the rule and clear its next run",
2898
+ "exclusive": [
2899
+ "start"
2900
+ ],
2901
+ "name": "stop",
2902
+ "allowNo": false,
2903
+ "type": "boolean"
2904
+ }
2905
+ },
2906
+ "hasDynamicHelp": false,
2907
+ "hiddenAliases": [],
2908
+ "id": "asa:automations:update",
2909
+ "pluginAlias": "adapty",
2910
+ "pluginName": "adapty",
2911
+ "pluginType": "core",
2912
+ "strict": true,
2913
+ "enableJsonFlag": true,
2914
+ "isESM": true,
2915
+ "relativePath": [
2916
+ "dist",
2917
+ "commands",
2918
+ "asa",
2919
+ "automations",
2920
+ "update.js"
2921
+ ]
2922
+ },
2923
+ "asa:campaigns:bulk-create": {
2924
+ "aliases": [],
2925
+ "args": {},
2926
+ "description": "Create a whole campaign structure (campaigns → ad groups → keywords/negative keywords/ads) in one bulk operation",
2927
+ "examples": [
2928
+ "<%= config.bin %> asa campaigns bulk-create --file structure.json",
2929
+ "cat structure.json | <%= config.bin %> asa campaigns bulk-create --file -",
2930
+ "<%= config.bin %> asa campaigns bulk-create --from-file Campaign_And_Adgroup_Template.xlsx --org-id 1234567",
2931
+ "<%= config.bin %> asa campaigns bulk-create --from-file keywords_template.csv --org-id 1234567 --preview"
2932
+ ],
2933
+ "flags": {
2934
+ "json": {
2935
+ "description": "Format output as json.",
2936
+ "helpGroup": "GLOBAL",
2937
+ "name": "json",
2938
+ "allowNo": false,
2939
+ "type": "boolean"
2940
+ },
2941
+ "yes": {
2942
+ "char": "y",
2943
+ "description": "Apply without asking; required when the output is piped or --json is used",
2944
+ "name": "yes",
2945
+ "allowNo": false,
2946
+ "type": "boolean"
2947
+ },
2948
+ "idempotency-key": {
2949
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2950
+ "name": "idempotency-key",
3189
2951
  "hasDynamicHelp": false,
3190
2952
  "multiple": false,
3191
2953
  "type": "option"
3192
2954
  },
3193
- "country": {
3194
- "description": "Replace the country list, repeatable",
3195
- "name": "country",
2955
+ "file": {
2956
+ "description": "JSON file with the campaign structure (the POST /bulk-operations/ body); use \"-\" for stdin",
2957
+ "name": "file",
3196
2958
  "hasDynamicHelp": false,
3197
- "multiple": true,
2959
+ "multiple": false,
3198
2960
  "type": "option"
3199
2961
  },
3200
- "daily-budget": {
3201
- "description": "Daily budget (amount, e.g. 50 or 12.50)",
3202
- "name": "daily-budget",
2962
+ "from-file": {
2963
+ "description": "Apple Ads bulk template (Campaign_And_Adgroup_Template.xlsx or keywords .csv) to convert and submit",
2964
+ "name": "from-file",
3203
2965
  "hasDynamicHelp": false,
3204
2966
  "multiple": false,
3205
2967
  "type": "option"
3206
2968
  },
3207
- "name": {
3208
- "description": "Campaign name",
3209
- "name": "name",
2969
+ "org-id": {
2970
+ "description": "Apple org id (campaign_group_id) the converted template will target; required with --from-file",
2971
+ "name": "org-id",
3210
2972
  "hasDynamicHelp": false,
3211
2973
  "multiple": false,
3212
2974
  "type": "option"
3213
2975
  },
3214
- "status": {
3215
- "description": "Campaign status",
3216
- "name": "status",
2976
+ "poll-interval": {
2977
+ "description": "Seconds between progress polls",
2978
+ "name": "poll-interval",
2979
+ "default": 5,
3217
2980
  "hasDynamicHelp": false,
3218
2981
  "multiple": false,
3219
- "options": [
3220
- "ENABLED",
3221
- "PAUSED"
3222
- ],
3223
2982
  "type": "option"
3224
2983
  },
3225
- "target-cpa": {
3226
- "description": "Target CPA (amount, e.g. 50 or 12.50)",
3227
- "name": "target-cpa",
2984
+ "preview": {
2985
+ "description": "With --from-file: print the converted request and stop, nothing is created",
2986
+ "name": "preview",
2987
+ "allowNo": false,
2988
+ "type": "boolean"
2989
+ },
2990
+ "timeout": {
2991
+ "description": "Max seconds to wait for the operation to finish",
2992
+ "name": "timeout",
2993
+ "default": 900,
3228
2994
  "hasDynamicHelp": false,
3229
2995
  "multiple": false,
3230
2996
  "type": "option"
2997
+ },
2998
+ "wait": {
2999
+ "description": "Poll the operation until it finishes; --no-wait returns the operation id immediately",
3000
+ "name": "wait",
3001
+ "allowNo": true,
3002
+ "type": "boolean"
3231
3003
  }
3232
3004
  },
3233
3005
  "hasDynamicHelp": false,
3234
3006
  "hiddenAliases": [],
3235
- "id": "asa:campaigns:update",
3007
+ "id": "asa:campaigns:bulk-create",
3236
3008
  "pluginAlias": "adapty",
3237
3009
  "pluginName": "adapty",
3238
3010
  "pluginType": "core",
@@ -3244,15 +3016,17 @@
3244
3016
  "commands",
3245
3017
  "asa",
3246
3018
  "campaigns",
3247
- "update.js"
3019
+ "bulk-create.js"
3248
3020
  ]
3249
3021
  },
3250
- "asa:competitors:summary": {
3022
+ "asa:campaigns:bulk-list": {
3251
3023
  "aliases": [],
3252
3024
  "args": {},
3253
- "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
3025
+ "description": "This company's bulk operations, newest first; inspect one with bulk-status",
3254
3026
  "examples": [
3255
- "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
3027
+ "<%= config.bin %> asa campaigns bulk-list",
3028
+ "<%= config.bin %> asa campaigns bulk-list --status partial --status failed",
3029
+ "<%= config.bin %> asa campaigns bulk-list --created-from 2026-08-01 --created-to 2026-08-20"
3256
3030
  ],
3257
3031
  "flags": {
3258
3032
  "json": {
@@ -3262,18 +3036,61 @@
3262
3036
  "allowNo": false,
3263
3037
  "type": "boolean"
3264
3038
  },
3265
- "app-ids": {
3266
- "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
3267
- "name": "app-ids",
3268
- "required": true,
3039
+ "page": {
3040
+ "description": "Page number",
3041
+ "name": "page",
3042
+ "default": 1,
3043
+ "hasDynamicHelp": false,
3044
+ "multiple": false,
3045
+ "type": "option"
3046
+ },
3047
+ "page-size": {
3048
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3049
+ "name": "page-size",
3050
+ "default": 100,
3051
+ "hasDynamicHelp": false,
3052
+ "multiple": false,
3053
+ "type": "option"
3054
+ },
3055
+ "app": {
3056
+ "description": "Keep only operations of this app (UUID)",
3057
+ "name": "app",
3058
+ "hasDynamicHelp": false,
3059
+ "multiple": false,
3060
+ "type": "option"
3061
+ },
3062
+ "created-from": {
3063
+ "description": "Keep only operations created on or after this date (YYYY-MM-DD)",
3064
+ "name": "created-from",
3065
+ "hasDynamicHelp": false,
3066
+ "multiple": false,
3067
+ "type": "option"
3068
+ },
3069
+ "created-to": {
3070
+ "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
3071
+ "name": "created-to",
3269
3072
  "hasDynamicHelp": false,
3270
3073
  "multiple": false,
3271
3074
  "type": "option"
3075
+ },
3076
+ "status": {
3077
+ "description": "Keep only operations in this state; repeatable",
3078
+ "name": "status",
3079
+ "hasDynamicHelp": false,
3080
+ "multiple": true,
3081
+ "options": [
3082
+ "failed",
3083
+ "partial",
3084
+ "pending",
3085
+ "running",
3086
+ "success"
3087
+ ],
3088
+ "type": "option"
3272
3089
  }
3273
3090
  },
3274
3091
  "hasDynamicHelp": false,
3275
3092
  "hiddenAliases": [],
3276
- "id": "asa:competitors:summary",
3093
+ "id": "asa:campaigns:bulk-list",
3277
3094
  "pluginAlias": "adapty",
3278
3095
  "pluginName": "adapty",
3279
3096
  "pluginType": "core",
@@ -3284,17 +3101,22 @@
3284
3101
  "dist",
3285
3102
  "commands",
3286
3103
  "asa",
3287
- "competitors",
3288
- "summary.js"
3104
+ "campaigns",
3105
+ "bulk-list.js"
3289
3106
  ]
3290
3107
  },
3291
- "asa:creatives:list": {
3108
+ "asa:campaigns:bulk-status": {
3292
3109
  "aliases": [],
3293
- "args": {},
3294
- "description": "List creatives; creative_id is what `asa ads create` needs",
3110
+ "args": {
3111
+ "operation-id": {
3112
+ "description": "Bulk operation ID returned by bulk-create",
3113
+ "name": "operation-id",
3114
+ "required": true
3115
+ }
3116
+ },
3117
+ "description": "Progress board of one bulk operation: counts, pipelines and the per-object log",
3295
3118
  "examples": [
3296
- "<%= config.bin %> asa creatives list",
3297
- "<%= config.bin %> asa creatives list --app APP_UUID"
3119
+ "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
3298
3120
  ],
3299
3121
  "flags": {
3300
3122
  "json": {
@@ -3319,25 +3141,11 @@
3319
3141
  "hasDynamicHelp": false,
3320
3142
  "multiple": false,
3321
3143
  "type": "option"
3322
- },
3323
- "app": {
3324
- "description": "Keep only rows in this app; repeatable",
3325
- "name": "app",
3326
- "hasDynamicHelp": false,
3327
- "multiple": true,
3328
- "type": "option"
3329
- },
3330
- "campaign-group": {
3331
- "description": "Keep only rows in this campaign group; repeatable",
3332
- "name": "campaign-group",
3333
- "hasDynamicHelp": false,
3334
- "multiple": true,
3335
- "type": "option"
3336
3144
  }
3337
3145
  },
3338
3146
  "hasDynamicHelp": false,
3339
3147
  "hiddenAliases": [],
3340
- "id": "asa:creatives:list",
3148
+ "id": "asa:campaigns:bulk-status",
3341
3149
  "pluginAlias": "adapty",
3342
3150
  "pluginName": "adapty",
3343
3151
  "pluginType": "core",
@@ -3348,17 +3156,18 @@
3348
3156
  "dist",
3349
3157
  "commands",
3350
3158
  "asa",
3351
- "creatives",
3352
- "list.js"
3159
+ "campaigns",
3160
+ "bulk-status.js"
3353
3161
  ]
3354
3162
  },
3355
- "asa:keywords:add": {
3163
+ "asa:campaigns:create": {
3356
3164
  "aliases": [],
3357
3165
  "args": {},
3358
- "description": "Add targeting keywords to an ad group",
3166
+ "description": "Create a campaign in Apple Search Ads. A Max Conversions campaign also needs an automated ad group (`asa ad-groups create --automated`); line-of-credit organizations must pass all five --invoice-* flags",
3359
3167
  "examples": [
3360
- "<%= config.bin %> asa keywords add --ad-group UUID --text \"running shoes\" --text \"trail shoes\" --bid 1.20",
3361
- "<%= config.bin %> asa keywords add --ad-group UUID --from-file keywords.txt --match-type EXACT"
3168
+ "<%= config.bin %> asa campaigns create --org UUID --name \"Winter push\" --adam-id 123456 --country US --daily-budget 50",
3169
+ "<%= config.bin %> asa campaigns create --org UUID --name \"Max Conv\" --adam-id 123456 --country US --daily-budget 50 --bidding-strategy MAX_CONVERSIONS",
3170
+ "<%= config.bin %> asa campaigns create --org UUID --name \"LOC push\" --adam-id 123456 --country US --daily-budget 50 --invoice-advertiser \"Acme Inc\" --invoice-order-number PO-42 --invoice-contact-name \"Jane Doe\" --invoice-contact-email jane@acme.com --invoice-billing-email billing@acme.com"
3362
3171
  ],
3363
3172
  "flags": {
3364
3173
  "json": {
@@ -3390,63 +3199,194 @@
3390
3199
  "multiple": false,
3391
3200
  "type": "option"
3392
3201
  },
3393
- "ad-group": {
3394
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
3395
- "name": "ad-group",
3396
- "required": true,
3202
+ "invoice-advertiser": {
3203
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
3204
+ "name": "invoice-advertiser",
3397
3205
  "hasDynamicHelp": false,
3398
3206
  "multiple": false,
3399
3207
  "type": "option"
3400
3208
  },
3401
- "bid": {
3402
- "description": "Bid per keyword (amount, e.g. 50 or 12.50)",
3403
- "name": "bid",
3209
+ "invoice-billing-email": {
3210
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): billing contact email",
3211
+ "name": "invoice-billing-email",
3404
3212
  "hasDynamicHelp": false,
3405
3213
  "multiple": false,
3406
3214
  "type": "option"
3407
3215
  },
3408
- "from-file": {
3409
- "description": "File with one keyword per line, combined with any --text values",
3410
- "name": "from-file",
3216
+ "invoice-contact-email": {
3217
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact email",
3218
+ "name": "invoice-contact-email",
3411
3219
  "hasDynamicHelp": false,
3412
3220
  "multiple": false,
3413
3221
  "type": "option"
3414
3222
  },
3415
- "match-type": {
3416
- "description": "Match type",
3417
- "name": "match-type",
3418
- "default": "BROAD",
3223
+ "invoice-contact-name": {
3224
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact name",
3225
+ "name": "invoice-contact-name",
3226
+ "hasDynamicHelp": false,
3227
+ "multiple": false,
3228
+ "type": "option"
3229
+ },
3230
+ "invoice-order-number": {
3231
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): order number",
3232
+ "name": "invoice-order-number",
3233
+ "hasDynamicHelp": false,
3234
+ "multiple": false,
3235
+ "type": "option"
3236
+ },
3237
+ "ad-channel-type": {
3238
+ "description": "Ad channel type",
3239
+ "name": "ad-channel-type",
3240
+ "default": "SEARCH",
3419
3241
  "hasDynamicHelp": false,
3420
3242
  "multiple": false,
3421
3243
  "options": [
3422
- "BROAD",
3423
- "EXACT"
3244
+ "DISPLAY",
3245
+ "SEARCH"
3246
+ ],
3247
+ "type": "option"
3248
+ },
3249
+ "adam-id": {
3250
+ "description": "App Store app ID (adam_id)",
3251
+ "name": "adam-id",
3252
+ "required": true,
3253
+ "hasDynamicHelp": false,
3254
+ "multiple": false,
3255
+ "type": "option"
3256
+ },
3257
+ "bidding-strategy": {
3258
+ "description": "Bidding strategy; Apple defaults to MANUAL_CPT when omitted",
3259
+ "name": "bidding-strategy",
3260
+ "hasDynamicHelp": false,
3261
+ "multiple": false,
3262
+ "options": [
3263
+ "MANUAL_CPT",
3264
+ "MAX_CONVERSIONS"
3265
+ ],
3266
+ "type": "option"
3267
+ },
3268
+ "billing-event": {
3269
+ "description": "Billing event",
3270
+ "name": "billing-event",
3271
+ "default": "TAPS",
3272
+ "hasDynamicHelp": false,
3273
+ "multiple": false,
3274
+ "options": [
3275
+ "IMPRESSIONS",
3276
+ "TAPS"
3424
3277
  ],
3425
3278
  "type": "option"
3426
3279
  },
3280
+ "budget": {
3281
+ "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
3282
+ "name": "budget",
3283
+ "hasDynamicHelp": false,
3284
+ "multiple": false,
3285
+ "type": "option"
3286
+ },
3287
+ "country": {
3288
+ "description": "Country or region code, repeatable",
3289
+ "name": "country",
3290
+ "required": true,
3291
+ "hasDynamicHelp": false,
3292
+ "multiple": true,
3293
+ "type": "option"
3294
+ },
3295
+ "daily-budget": {
3296
+ "description": "Daily budget (amount, e.g. 50 or 12.50)",
3297
+ "name": "daily-budget",
3298
+ "required": true,
3299
+ "hasDynamicHelp": false,
3300
+ "multiple": false,
3301
+ "type": "option"
3302
+ },
3303
+ "name": {
3304
+ "description": "Campaign name",
3305
+ "name": "name",
3306
+ "required": true,
3307
+ "hasDynamicHelp": false,
3308
+ "multiple": false,
3309
+ "type": "option"
3310
+ },
3311
+ "org": {
3312
+ "description": "Campaign group ID (UUID) — see `adapty asa orgs list`",
3313
+ "name": "org",
3314
+ "required": true,
3315
+ "hasDynamicHelp": false,
3316
+ "multiple": false,
3317
+ "type": "option"
3318
+ },
3427
3319
  "status": {
3428
- "description": "Keyword status",
3320
+ "description": "Initial status",
3429
3321
  "name": "status",
3430
- "default": "ACTIVE",
3431
3322
  "hasDynamicHelp": false,
3432
3323
  "multiple": false,
3433
3324
  "options": [
3434
- "ACTIVE",
3325
+ "ENABLED",
3435
3326
  "PAUSED"
3436
3327
  ],
3437
3328
  "type": "option"
3438
3329
  },
3439
- "text": {
3440
- "description": "Keyword text, repeatable",
3441
- "name": "text",
3330
+ "supply-source": {
3331
+ "description": "Supply source, repeatable",
3332
+ "name": "supply-source",
3333
+ "default": [
3334
+ "APPSTORE_SEARCH_RESULTS"
3335
+ ],
3442
3336
  "hasDynamicHelp": false,
3443
3337
  "multiple": true,
3444
3338
  "type": "option"
3339
+ },
3340
+ "target-cpa": {
3341
+ "description": "Target CPA; must be lower than --daily-budget (amount, e.g. 50 or 12.50)",
3342
+ "name": "target-cpa",
3343
+ "hasDynamicHelp": false,
3344
+ "multiple": false,
3345
+ "type": "option"
3346
+ }
3347
+ },
3348
+ "hasDynamicHelp": false,
3349
+ "hiddenAliases": [],
3350
+ "id": "asa:campaigns:create",
3351
+ "pluginAlias": "adapty",
3352
+ "pluginName": "adapty",
3353
+ "pluginType": "core",
3354
+ "strict": true,
3355
+ "enableJsonFlag": true,
3356
+ "isESM": true,
3357
+ "relativePath": [
3358
+ "dist",
3359
+ "commands",
3360
+ "asa",
3361
+ "campaigns",
3362
+ "create.js"
3363
+ ]
3364
+ },
3365
+ "asa:campaigns:get": {
3366
+ "aliases": [],
3367
+ "args": {
3368
+ "campaign_id": {
3369
+ "description": "Campaign ID (UUID)",
3370
+ "name": "campaign_id",
3371
+ "required": true
3372
+ }
3373
+ },
3374
+ "description": "Show one campaign; read numbers with asa metrics",
3375
+ "examples": [
3376
+ "<%= config.bin %> asa campaigns get 550e8400-e29b-41d4-a716-446655440000"
3377
+ ],
3378
+ "flags": {
3379
+ "json": {
3380
+ "description": "Format output as json.",
3381
+ "helpGroup": "GLOBAL",
3382
+ "name": "json",
3383
+ "allowNo": false,
3384
+ "type": "boolean"
3445
3385
  }
3446
3386
  },
3447
3387
  "hasDynamicHelp": false,
3448
3388
  "hiddenAliases": [],
3449
- "id": "asa:keywords:add",
3389
+ "id": "asa:campaigns:get",
3450
3390
  "pluginAlias": "adapty",
3451
3391
  "pluginName": "adapty",
3452
3392
  "pluginType": "core",
@@ -3457,17 +3397,17 @@
3457
3397
  "dist",
3458
3398
  "commands",
3459
3399
  "asa",
3460
- "keywords",
3461
- "add.js"
3400
+ "campaigns",
3401
+ "get.js"
3462
3402
  ]
3463
3403
  },
3464
- "asa:keywords:list": {
3404
+ "asa:campaigns:list": {
3465
3405
  "aliases": [],
3466
3406
  "args": {},
3467
- "description": "List targeting keywords; read numbers with asa metrics",
3407
+ "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
3468
3408
  "examples": [
3469
- "<%= config.bin %> asa keywords list",
3470
- "<%= config.bin %> asa keywords list --ad-group AD_GROUP_UUID --status ACTIVE"
3409
+ "<%= config.bin %> asa campaigns list",
3410
+ "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
3471
3411
  ],
3472
3412
  "flags": {
3473
3413
  "json": {
@@ -3514,27 +3454,13 @@
3514
3454
  "multiple": false,
3515
3455
  "type": "option"
3516
3456
  },
3517
- "campaign": {
3518
- "description": "Keep only rows in this campaign; repeatable",
3519
- "name": "campaign",
3520
- "hasDynamicHelp": false,
3521
- "multiple": true,
3522
- "type": "option"
3523
- },
3524
- "ad-group": {
3525
- "description": "Keep only rows in this ad group; repeatable",
3526
- "name": "ad-group",
3527
- "hasDynamicHelp": false,
3528
- "multiple": true,
3529
- "type": "option"
3530
- },
3531
3457
  "status": {
3532
3458
  "description": "Keep only rows in this state",
3533
3459
  "name": "status",
3534
3460
  "hasDynamicHelp": false,
3535
3461
  "multiple": false,
3536
3462
  "options": [
3537
- "ACTIVE",
3463
+ "ENABLED",
3538
3464
  "PAUSED"
3539
3465
  ],
3540
3466
  "type": "option"
@@ -3542,7 +3468,7 @@
3542
3468
  },
3543
3469
  "hasDynamicHelp": false,
3544
3470
  "hiddenAliases": [],
3545
- "id": "asa:keywords:list",
3471
+ "id": "asa:campaigns:list",
3546
3472
  "pluginAlias": "adapty",
3547
3473
  "pluginName": "adapty",
3548
3474
  "pluginType": "core",
@@ -3553,23 +3479,24 @@
3553
3479
  "dist",
3554
3480
  "commands",
3555
3481
  "asa",
3556
- "keywords",
3482
+ "campaigns",
3557
3483
  "list.js"
3558
3484
  ]
3559
3485
  },
3560
- "asa:keywords:update": {
3486
+ "asa:campaigns:update": {
3561
3487
  "aliases": [],
3562
3488
  "args": {
3563
- "keyword_id": {
3564
- "description": "Keyword ID (UUID), repeatable as extra arguments",
3565
- "name": "keyword_id",
3489
+ "campaign_id": {
3490
+ "description": "Campaign ID (UUID)",
3491
+ "name": "campaign_id",
3566
3492
  "required": true
3567
3493
  }
3568
3494
  },
3569
- "description": "Change bid, status, text or match type of keywords",
3495
+ "description": "Change a campaign: budgets, countries, status, schedule or Invoicing Options (all five --invoice-* flags together; they replace the stored set)",
3570
3496
  "examples": [
3571
- "<%= config.bin %> asa keywords update UUID --bid 2.00",
3572
- "<%= config.bin %> asa keywords update UUID_A UUID_B --status PAUSED"
3497
+ "<%= config.bin %> asa campaigns update UUID --status PAUSED",
3498
+ "<%= config.bin %> asa campaigns update UUID --daily-budget 80",
3499
+ "<%= config.bin %> asa campaigns update UUID --invoice-advertiser \"Acme Inc\" --invoice-order-number PO-42 --invoice-contact-name \"Jane Doe\" --invoice-contact-email jane@acme.com --invoice-billing-email billing@acme.com"
3573
3500
  ],
3574
3501
  "flags": {
3575
3502
  "json": {
@@ -3601,38 +3528,94 @@
3601
3528
  "multiple": false,
3602
3529
  "type": "option"
3603
3530
  },
3604
- "bid": {
3605
- "description": "Bid (amount, e.g. 50 or 12.50)",
3606
- "name": "bid",
3531
+ "invoice-advertiser": {
3532
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
3533
+ "name": "invoice-advertiser",
3607
3534
  "hasDynamicHelp": false,
3608
3535
  "multiple": false,
3609
3536
  "type": "option"
3610
3537
  },
3611
- "match-type": {
3612
- "description": "Match type",
3613
- "name": "match-type",
3538
+ "invoice-billing-email": {
3539
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): billing contact email",
3540
+ "name": "invoice-billing-email",
3541
+ "hasDynamicHelp": false,
3542
+ "multiple": false,
3543
+ "type": "option"
3544
+ },
3545
+ "invoice-contact-email": {
3546
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact email",
3547
+ "name": "invoice-contact-email",
3548
+ "hasDynamicHelp": false,
3549
+ "multiple": false,
3550
+ "type": "option"
3551
+ },
3552
+ "invoice-contact-name": {
3553
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact name",
3554
+ "name": "invoice-contact-name",
3555
+ "hasDynamicHelp": false,
3556
+ "multiple": false,
3557
+ "type": "option"
3558
+ },
3559
+ "invoice-order-number": {
3560
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): order number",
3561
+ "name": "invoice-order-number",
3562
+ "hasDynamicHelp": false,
3563
+ "multiple": false,
3564
+ "type": "option"
3565
+ },
3566
+ "bidding-strategy": {
3567
+ "description": "Bidding strategy",
3568
+ "name": "bidding-strategy",
3614
3569
  "hasDynamicHelp": false,
3615
3570
  "multiple": false,
3616
3571
  "options": [
3617
- "BROAD",
3618
- "EXACT"
3572
+ "MANUAL_CPT",
3573
+ "MAX_CONVERSIONS"
3619
3574
  ],
3620
3575
  "type": "option"
3621
3576
  },
3577
+ "budget": {
3578
+ "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
3579
+ "name": "budget",
3580
+ "hasDynamicHelp": false,
3581
+ "multiple": false,
3582
+ "type": "option"
3583
+ },
3584
+ "country": {
3585
+ "description": "Replace the country list, repeatable",
3586
+ "name": "country",
3587
+ "hasDynamicHelp": false,
3588
+ "multiple": true,
3589
+ "type": "option"
3590
+ },
3591
+ "daily-budget": {
3592
+ "description": "Daily budget (amount, e.g. 50 or 12.50)",
3593
+ "name": "daily-budget",
3594
+ "hasDynamicHelp": false,
3595
+ "multiple": false,
3596
+ "type": "option"
3597
+ },
3598
+ "name": {
3599
+ "description": "Campaign name",
3600
+ "name": "name",
3601
+ "hasDynamicHelp": false,
3602
+ "multiple": false,
3603
+ "type": "option"
3604
+ },
3622
3605
  "status": {
3623
- "description": "Keyword status",
3606
+ "description": "Campaign status",
3624
3607
  "name": "status",
3625
3608
  "hasDynamicHelp": false,
3626
3609
  "multiple": false,
3627
3610
  "options": [
3628
- "ACTIVE",
3611
+ "ENABLED",
3629
3612
  "PAUSED"
3630
3613
  ],
3631
3614
  "type": "option"
3632
3615
  },
3633
- "text": {
3634
- "description": "Keyword text (only meaningful for a single keyword)",
3635
- "name": "text",
3616
+ "target-cpa": {
3617
+ "description": "Target CPA (amount, e.g. 50 or 12.50)",
3618
+ "name": "target-cpa",
3636
3619
  "hasDynamicHelp": false,
3637
3620
  "multiple": false,
3638
3621
  "type": "option"
@@ -3640,29 +3623,27 @@
3640
3623
  },
3641
3624
  "hasDynamicHelp": false,
3642
3625
  "hiddenAliases": [],
3643
- "id": "asa:keywords:update",
3626
+ "id": "asa:campaigns:update",
3644
3627
  "pluginAlias": "adapty",
3645
3628
  "pluginName": "adapty",
3646
3629
  "pluginType": "core",
3647
- "strict": false,
3630
+ "strict": true,
3648
3631
  "enableJsonFlag": true,
3649
3632
  "isESM": true,
3650
3633
  "relativePath": [
3651
3634
  "dist",
3652
3635
  "commands",
3653
3636
  "asa",
3654
- "keywords",
3637
+ "campaigns",
3655
3638
  "update.js"
3656
3639
  ]
3657
3640
  },
3658
- "asa:negative-keywords:add": {
3641
+ "asa:competitors:summary": {
3659
3642
  "aliases": [],
3660
3643
  "args": {},
3661
- "description": "Add negative keywords to an ad group or across a campaign",
3644
+ "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
3662
3645
  "examples": [
3663
- "<%= config.bin %> asa negative-keywords add --ad-group UUID --text \"free\"",
3664
- "<%= config.bin %> asa negative-keywords add --campaign UUID --text \"free\" --text \"cheap\"",
3665
- "<%= config.bin %> asa negative-keywords add --campaign UUID --all-ad-groups --text \"free\""
3646
+ "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
3666
3647
  ],
3667
3648
  "flags": {
3668
3649
  "json": {
@@ -3672,77 +3653,74 @@
3672
3653
  "allowNo": false,
3673
3654
  "type": "boolean"
3674
3655
  },
3675
- "yes": {
3676
- "char": "y",
3677
- "description": "Apply without asking; required when the output is piped or --json is used",
3678
- "name": "yes",
3679
- "allowNo": false,
3680
- "type": "boolean"
3681
- },
3682
- "idempotency-key": {
3683
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3684
- "name": "idempotency-key",
3685
- "hasDynamicHelp": false,
3686
- "multiple": false,
3687
- "type": "option"
3688
- },
3689
- "ad-group": {
3690
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
3691
- "exclusive": [
3692
- "campaign"
3693
- ],
3694
- "name": "ad-group",
3656
+ "app-ids": {
3657
+ "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
3658
+ "name": "app-ids",
3659
+ "required": true,
3695
3660
  "hasDynamicHelp": false,
3696
3661
  "multiple": false,
3697
3662
  "type": "option"
3698
- },
3699
- "all-ad-groups": {
3700
- "dependsOn": [
3701
- "campaign"
3702
- ],
3703
- "description": "Apply to every ad group of the campaign instead of the campaign itself",
3704
- "name": "all-ad-groups",
3663
+ }
3664
+ },
3665
+ "hasDynamicHelp": false,
3666
+ "hiddenAliases": [],
3667
+ "id": "asa:competitors:summary",
3668
+ "pluginAlias": "adapty",
3669
+ "pluginName": "adapty",
3670
+ "pluginType": "core",
3671
+ "strict": true,
3672
+ "enableJsonFlag": true,
3673
+ "isESM": true,
3674
+ "relativePath": [
3675
+ "dist",
3676
+ "commands",
3677
+ "asa",
3678
+ "competitors",
3679
+ "summary.js"
3680
+ ]
3681
+ },
3682
+ "asa:creatives:list": {
3683
+ "aliases": [],
3684
+ "args": {},
3685
+ "description": "List creatives; creative_id is what `asa ads create` needs",
3686
+ "examples": [
3687
+ "<%= config.bin %> asa creatives list",
3688
+ "<%= config.bin %> asa creatives list --app APP_UUID"
3689
+ ],
3690
+ "flags": {
3691
+ "json": {
3692
+ "description": "Format output as json.",
3693
+ "helpGroup": "GLOBAL",
3694
+ "name": "json",
3705
3695
  "allowNo": false,
3706
3696
  "type": "boolean"
3707
3697
  },
3708
- "campaign": {
3709
- "description": "Campaign ID (UUID)",
3710
- "exclusive": [
3711
- "ad-group"
3712
- ],
3713
- "name": "campaign",
3698
+ "page": {
3699
+ "description": "Page number",
3700
+ "name": "page",
3701
+ "default": 1,
3714
3702
  "hasDynamicHelp": false,
3715
3703
  "multiple": false,
3716
3704
  "type": "option"
3717
3705
  },
3718
- "match-type": {
3719
- "description": "Match type",
3720
- "name": "match-type",
3721
- "default": "EXACT",
3706
+ "page-size": {
3707
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3708
+ "name": "page-size",
3709
+ "default": 100,
3722
3710
  "hasDynamicHelp": false,
3723
3711
  "multiple": false,
3724
- "options": [
3725
- "BROAD",
3726
- "EXACT"
3727
- ],
3728
3712
  "type": "option"
3729
3713
  },
3730
- "status": {
3731
- "description": "Keyword status",
3732
- "name": "status",
3733
- "default": "ACTIVE",
3714
+ "app": {
3715
+ "description": "Keep only rows in this app; repeatable",
3716
+ "name": "app",
3734
3717
  "hasDynamicHelp": false,
3735
- "multiple": false,
3736
- "options": [
3737
- "ACTIVE",
3738
- "PAUSED"
3739
- ],
3718
+ "multiple": true,
3740
3719
  "type": "option"
3741
3720
  },
3742
- "text": {
3743
- "description": "Keyword text, repeatable",
3744
- "name": "text",
3745
- "required": true,
3721
+ "campaign-group": {
3722
+ "description": "Keep only rows in this campaign group; repeatable",
3723
+ "name": "campaign-group",
3746
3724
  "hasDynamicHelp": false,
3747
3725
  "multiple": true,
3748
3726
  "type": "option"
@@ -3750,7 +3728,7 @@
3750
3728
  },
3751
3729
  "hasDynamicHelp": false,
3752
3730
  "hiddenAliases": [],
3753
- "id": "asa:negative-keywords:add",
3731
+ "id": "asa:creatives:list",
3754
3732
  "pluginAlias": "adapty",
3755
3733
  "pluginName": "adapty",
3756
3734
  "pluginType": "core",
@@ -3761,17 +3739,21 @@
3761
3739
  "dist",
3762
3740
  "commands",
3763
3741
  "asa",
3764
- "negative-keywords",
3765
- "add.js"
3742
+ "creatives",
3743
+ "list.js"
3766
3744
  ]
3767
3745
  },
3768
- "asa:negative-keywords:list": {
3746
+ "asa:metrics": {
3769
3747
  "aliases": [],
3770
3748
  "args": {},
3771
- "description": "List negative keywords; ad_group_id is empty for campaign-level ones",
3749
+ "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 5000 breakdown\nrows (entities × countries × periods); over it the call fails with 422 cli_response_too_large — coarsen\nthe grouping, narrow the window, or reduce page[size]. Budget: 5 metrics calls per minute, at most\n2 per 10 seconds, one at a time.\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.",
3772
3750
  "examples": [
3773
- "<%= config.bin %> asa negative-keywords list",
3774
- "<%= config.bin %> asa negative-keywords list --campaign CAMPAIGN_UUID"
3751
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric adapty_installs",
3752
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --order-by spend --page-size 5",
3753
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --group-by country --page-size 1000",
3754
+ "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric roas",
3755
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric roas --by-days 7 --by-days 90",
3756
+ "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric arpas --campaign 0f0e..."
3775
3757
  ],
3776
3758
  "flags": {
3777
3759
  "json": {
@@ -3797,6 +3779,20 @@
3797
3779
  "multiple": false,
3798
3780
  "type": "option"
3799
3781
  },
3782
+ "by-days": {
3783
+ "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
3784
+ "name": "by-days",
3785
+ "hasDynamicHelp": false,
3786
+ "multiple": true,
3787
+ "type": "option"
3788
+ },
3789
+ "ad-group": {
3790
+ "description": "Keep only rows in this ad group; repeatable",
3791
+ "name": "ad-group",
3792
+ "hasDynamicHelp": false,
3793
+ "multiple": true,
3794
+ "type": "option"
3795
+ },
3800
3796
  "app": {
3801
3797
  "description": "Keep only rows in this app; repeatable",
3802
3798
  "name": "app",
@@ -3804,44 +3800,96 @@
3804
3800
  "multiple": true,
3805
3801
  "type": "option"
3806
3802
  },
3807
- "campaign-group": {
3808
- "description": "Keep only rows in this campaign group; repeatable",
3809
- "name": "campaign-group",
3803
+ "campaign": {
3804
+ "description": "Keep only rows in this campaign; repeatable",
3805
+ "name": "campaign",
3810
3806
  "hasDynamicHelp": false,
3811
3807
  "multiple": true,
3812
3808
  "type": "option"
3813
3809
  },
3814
- "search": {
3815
- "description": "Case-insensitive substring match on the name",
3816
- "name": "search",
3810
+ "date-from": {
3811
+ "description": "Start of the period (YYYY-MM-DD)",
3812
+ "name": "date-from",
3813
+ "required": true,
3817
3814
  "hasDynamicHelp": false,
3818
3815
  "multiple": false,
3819
3816
  "type": "option"
3820
3817
  },
3821
- "campaign": {
3822
- "description": "Keep only rows in this campaign; repeatable",
3823
- "name": "campaign",
3818
+ "date-to": {
3819
+ "description": "End of the period (YYYY-MM-DD)",
3820
+ "name": "date-to",
3821
+ "required": true,
3822
+ "hasDynamicHelp": false,
3823
+ "multiple": false,
3824
+ "type": "option"
3825
+ },
3826
+ "entity": {
3827
+ "description": "What to report on",
3828
+ "name": "entity",
3829
+ "required": true,
3830
+ "hasDynamicHelp": false,
3831
+ "multiple": false,
3832
+ "options": [
3833
+ "ad",
3834
+ "ad-group",
3835
+ "campaign",
3836
+ "keyword"
3837
+ ],
3838
+ "type": "option"
3839
+ },
3840
+ "group-by": {
3841
+ "description": "Break the rows down by a dimension, repeatable",
3842
+ "name": "group-by",
3824
3843
  "hasDynamicHelp": false,
3825
3844
  "multiple": true,
3845
+ "options": [
3846
+ "country",
3847
+ "day",
3848
+ "month",
3849
+ "quarter",
3850
+ "week",
3851
+ "year"
3852
+ ],
3826
3853
  "type": "option"
3827
3854
  },
3828
- "ad-group": {
3829
- "description": "Keep only rows in this ad group; repeatable",
3830
- "name": "ad-group",
3855
+ "metric": {
3856
+ "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",
3857
+ "name": "metric",
3858
+ "required": true,
3831
3859
  "hasDynamicHelp": false,
3832
3860
  "multiple": true,
3833
3861
  "type": "option"
3834
3862
  },
3835
- "campaign-level-only": {
3836
- "description": "Keep only campaign-level rows (ad_group_id is null)",
3837
- "name": "campaign-level-only",
3838
- "allowNo": false,
3839
- "type": "boolean"
3863
+ "order": {
3864
+ "description": "Sort direction",
3865
+ "name": "order",
3866
+ "default": "desc",
3867
+ "hasDynamicHelp": false,
3868
+ "multiple": false,
3869
+ "options": [
3870
+ "asc",
3871
+ "desc"
3872
+ ],
3873
+ "type": "option"
3874
+ },
3875
+ "order-by": {
3876
+ "description": "Metric or field to sort by; cohort metrics rank via their gross_/proceeds_/net_ names",
3877
+ "name": "order-by",
3878
+ "hasDynamicHelp": false,
3879
+ "multiple": false,
3880
+ "type": "option"
3881
+ },
3882
+ "order-by-day": {
3883
+ "description": "Rank by a cohort metric at this renewal window; must be one of the --by-days values",
3884
+ "name": "order-by-day",
3885
+ "hasDynamicHelp": false,
3886
+ "multiple": false,
3887
+ "type": "option"
3840
3888
  }
3841
3889
  },
3842
3890
  "hasDynamicHelp": false,
3843
3891
  "hiddenAliases": [],
3844
- "id": "asa:negative-keywords:list",
3892
+ "id": "asa:metrics",
3845
3893
  "pluginAlias": "adapty",
3846
3894
  "pluginName": "adapty",
3847
3895
  "pluginType": "core",
@@ -3852,20 +3900,17 @@
3852
3900
  "dist",
3853
3901
  "commands",
3854
3902
  "asa",
3855
- "negative-keywords",
3856
- "list.js"
3903
+ "metrics",
3904
+ "index.js"
3857
3905
  ]
3858
3906
  },
3859
- "asa:metrics": {
3907
+ "asa:metrics:overview": {
3860
3908
  "aliases": [],
3861
3909
  "args": {},
3862
- "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 20000 breakdown\nrows (entities × countries × periods); over it the call fails with 422 cli_response_too_large — coarsen\nthe grouping, narrow the window, or reduce page[size]. Budget: 5 metrics calls per minute, at most\n2 per 10 seconds, one at a time.",
3910
+ "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.",
3863
3911
  "examples": [
3864
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
3865
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --order-by spend --page-size 5",
3866
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --group-by country --page-size 1000",
3867
- "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric roas",
3868
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric roas --by-days 7 --by-days 90"
3912
+ "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
3913
+ "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --period-unit WEEK"
3869
3914
  ],
3870
3915
  "flags": {
3871
3916
  "json": {
@@ -3875,22 +3920,6 @@
3875
3920
  "allowNo": false,
3876
3921
  "type": "boolean"
3877
3922
  },
3878
- "page": {
3879
- "description": "Page number",
3880
- "name": "page",
3881
- "default": 1,
3882
- "hasDynamicHelp": false,
3883
- "multiple": false,
3884
- "type": "option"
3885
- },
3886
- "page-size": {
3887
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3888
- "name": "page-size",
3889
- "default": 100,
3890
- "hasDynamicHelp": false,
3891
- "multiple": false,
3892
- "type": "option"
3893
- },
3894
3923
  "by-days": {
3895
3924
  "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
3896
3925
  "name": "by-days",
@@ -3928,13 +3957,20 @@
3928
3957
  ],
3929
3958
  "type": "option"
3930
3959
  },
3931
- "group-by": {
3932
- "description": "Break the rows down by a dimension, repeatable",
3933
- "name": "group-by",
3960
+ "metric": {
3961
+ "description": "Metric name, repeatable; cohort roots only here (revenue, roas, arpu), not their gross_/proceeds_/net_ variants; omit for every metric",
3962
+ "name": "metric",
3934
3963
  "hasDynamicHelp": false,
3935
3964
  "multiple": true,
3965
+ "type": "option"
3966
+ },
3967
+ "period-unit": {
3968
+ "description": "Bucket size",
3969
+ "name": "period-unit",
3970
+ "default": "day",
3971
+ "hasDynamicHelp": false,
3972
+ "multiple": false,
3936
3973
  "options": [
3937
- "country",
3938
3974
  "day",
3939
3975
  "month",
3940
3976
  "quarter",
@@ -3942,44 +3978,170 @@
3942
3978
  "year"
3943
3979
  ],
3944
3980
  "type": "option"
3981
+ }
3982
+ },
3983
+ "hasDynamicHelp": false,
3984
+ "hiddenAliases": [],
3985
+ "id": "asa:metrics:overview",
3986
+ "pluginAlias": "adapty",
3987
+ "pluginName": "adapty",
3988
+ "pluginType": "core",
3989
+ "strict": true,
3990
+ "enableJsonFlag": true,
3991
+ "isESM": true,
3992
+ "relativePath": [
3993
+ "dist",
3994
+ "commands",
3995
+ "asa",
3996
+ "metrics",
3997
+ "overview.js"
3998
+ ]
3999
+ },
4000
+ "asa:orgs:list": {
4001
+ "aliases": [],
4002
+ "args": {},
4003
+ "description": "List the Apple Search Ads organizations this company can spend from",
4004
+ "examples": [
4005
+ "<%= config.bin %> asa orgs list"
4006
+ ],
4007
+ "flags": {
4008
+ "json": {
4009
+ "description": "Format output as json.",
4010
+ "helpGroup": "GLOBAL",
4011
+ "name": "json",
4012
+ "allowNo": false,
4013
+ "type": "boolean"
4014
+ },
4015
+ "page": {
4016
+ "description": "Page number",
4017
+ "name": "page",
4018
+ "default": 1,
4019
+ "hasDynamicHelp": false,
4020
+ "multiple": false,
4021
+ "type": "option"
4022
+ },
4023
+ "page-size": {
4024
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4025
+ "name": "page-size",
4026
+ "default": 100,
4027
+ "hasDynamicHelp": false,
4028
+ "multiple": false,
4029
+ "type": "option"
4030
+ }
4031
+ },
4032
+ "hasDynamicHelp": false,
4033
+ "hiddenAliases": [],
4034
+ "id": "asa:orgs:list",
4035
+ "pluginAlias": "adapty",
4036
+ "pluginName": "adapty",
4037
+ "pluginType": "core",
4038
+ "strict": true,
4039
+ "enableJsonFlag": true,
4040
+ "isESM": true,
4041
+ "relativePath": [
4042
+ "dist",
4043
+ "commands",
4044
+ "asa",
4045
+ "orgs",
4046
+ "list.js"
4047
+ ]
4048
+ },
4049
+ "asa:negative-keywords:add": {
4050
+ "aliases": [],
4051
+ "args": {},
4052
+ "description": "Add negative keywords to an ad group or across a campaign",
4053
+ "examples": [
4054
+ "<%= config.bin %> asa negative-keywords add --ad-group UUID --text \"free\"",
4055
+ "<%= config.bin %> asa negative-keywords add --campaign UUID --text \"free\" --text \"cheap\"",
4056
+ "<%= config.bin %> asa negative-keywords add --campaign UUID --all-ad-groups --text \"free\""
4057
+ ],
4058
+ "flags": {
4059
+ "json": {
4060
+ "description": "Format output as json.",
4061
+ "helpGroup": "GLOBAL",
4062
+ "name": "json",
4063
+ "allowNo": false,
4064
+ "type": "boolean"
4065
+ },
4066
+ "yes": {
4067
+ "char": "y",
4068
+ "description": "Apply without asking; required when the output is piped or --json is used",
4069
+ "name": "yes",
4070
+ "allowNo": false,
4071
+ "type": "boolean"
4072
+ },
4073
+ "idempotency-key": {
4074
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4075
+ "name": "idempotency-key",
4076
+ "hasDynamicHelp": false,
4077
+ "multiple": false,
4078
+ "type": "option"
4079
+ },
4080
+ "ad-group": {
4081
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
4082
+ "exclusive": [
4083
+ "campaign"
4084
+ ],
4085
+ "name": "ad-group",
4086
+ "hasDynamicHelp": false,
4087
+ "multiple": false,
4088
+ "type": "option"
3945
4089
  },
3946
- "metric": {
3947
- "description": "Metric name (dashboard nomenclature, e.g. spend, taps, gross_roas), repeatable; omit for every metric; a wrong name fails listing all valid ones",
3948
- "name": "metric",
4090
+ "all-ad-groups": {
4091
+ "dependsOn": [
4092
+ "campaign"
4093
+ ],
4094
+ "description": "Apply to every ad group of the campaign instead of the campaign itself",
4095
+ "name": "all-ad-groups",
4096
+ "allowNo": false,
4097
+ "type": "boolean"
4098
+ },
4099
+ "campaign": {
4100
+ "description": "Campaign ID (UUID)",
4101
+ "exclusive": [
4102
+ "ad-group"
4103
+ ],
4104
+ "name": "campaign",
3949
4105
  "hasDynamicHelp": false,
3950
- "multiple": true,
4106
+ "multiple": false,
3951
4107
  "type": "option"
3952
4108
  },
3953
- "order": {
3954
- "description": "Sort direction",
3955
- "name": "order",
3956
- "default": "desc",
4109
+ "match-type": {
4110
+ "description": "Match type",
4111
+ "name": "match-type",
4112
+ "default": "EXACT",
3957
4113
  "hasDynamicHelp": false,
3958
4114
  "multiple": false,
3959
4115
  "options": [
3960
- "asc",
3961
- "desc"
4116
+ "BROAD",
4117
+ "EXACT"
3962
4118
  ],
3963
4119
  "type": "option"
3964
4120
  },
3965
- "order-by": {
3966
- "description": "Metric or field to sort by; cohort metrics rank via their gross_/proceeds_/net_ names",
3967
- "name": "order-by",
4121
+ "status": {
4122
+ "description": "Keyword status",
4123
+ "name": "status",
4124
+ "default": "ACTIVE",
3968
4125
  "hasDynamicHelp": false,
3969
4126
  "multiple": false,
4127
+ "options": [
4128
+ "ACTIVE",
4129
+ "PAUSED"
4130
+ ],
3970
4131
  "type": "option"
3971
4132
  },
3972
- "order-by-day": {
3973
- "description": "Rank by a cohort metric at this renewal window; must be one of the --by-days values",
3974
- "name": "order-by-day",
4133
+ "text": {
4134
+ "description": "Keyword text, repeatable",
4135
+ "name": "text",
4136
+ "required": true,
3975
4137
  "hasDynamicHelp": false,
3976
- "multiple": false,
4138
+ "multiple": true,
3977
4139
  "type": "option"
3978
4140
  }
3979
4141
  },
3980
4142
  "hasDynamicHelp": false,
3981
4143
  "hiddenAliases": [],
3982
- "id": "asa:metrics",
4144
+ "id": "asa:negative-keywords:add",
3983
4145
  "pluginAlias": "adapty",
3984
4146
  "pluginName": "adapty",
3985
4147
  "pluginType": "core",
@@ -3990,17 +4152,17 @@
3990
4152
  "dist",
3991
4153
  "commands",
3992
4154
  "asa",
3993
- "metrics",
3994
- "index.js"
4155
+ "negative-keywords",
4156
+ "add.js"
3995
4157
  ]
3996
4158
  },
3997
- "asa:metrics:overview": {
4159
+ "asa:negative-keywords:list": {
3998
4160
  "aliases": [],
3999
4161
  "args": {},
4000
- "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.",
4162
+ "description": "List negative keywords; ad_group_id is empty for campaign-level ones",
4001
4163
  "examples": [
4002
- "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
4003
- "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --period-unit WEEK"
4164
+ "<%= config.bin %> asa negative-keywords list",
4165
+ "<%= config.bin %> asa negative-keywords list --campaign CAMPAIGN_UUID"
4004
4166
  ],
4005
4167
  "flags": {
4006
4168
  "json": {
@@ -4010,69 +4172,67 @@
4010
4172
  "allowNo": false,
4011
4173
  "type": "boolean"
4012
4174
  },
4013
- "by-days": {
4014
- "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
4015
- "name": "by-days",
4175
+ "page": {
4176
+ "description": "Page number",
4177
+ "name": "page",
4178
+ "default": 1,
4016
4179
  "hasDynamicHelp": false,
4017
- "multiple": true,
4180
+ "multiple": false,
4018
4181
  "type": "option"
4019
4182
  },
4020
- "date-from": {
4021
- "description": "Start of the period (YYYY-MM-DD)",
4022
- "name": "date-from",
4023
- "required": true,
4183
+ "page-size": {
4184
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4185
+ "name": "page-size",
4186
+ "default": 100,
4024
4187
  "hasDynamicHelp": false,
4025
4188
  "multiple": false,
4026
4189
  "type": "option"
4027
4190
  },
4028
- "date-to": {
4029
- "description": "End of the period (YYYY-MM-DD)",
4030
- "name": "date-to",
4031
- "required": true,
4191
+ "app": {
4192
+ "description": "Keep only rows in this app; repeatable",
4193
+ "name": "app",
4032
4194
  "hasDynamicHelp": false,
4033
- "multiple": false,
4195
+ "multiple": true,
4034
4196
  "type": "option"
4035
4197
  },
4036
- "entity": {
4037
- "description": "What to report on",
4038
- "name": "entity",
4039
- "required": true,
4198
+ "campaign-group": {
4199
+ "description": "Keep only rows in this campaign group; repeatable",
4200
+ "name": "campaign-group",
4201
+ "hasDynamicHelp": false,
4202
+ "multiple": true,
4203
+ "type": "option"
4204
+ },
4205
+ "search": {
4206
+ "description": "Case-insensitive substring match on the name",
4207
+ "name": "search",
4040
4208
  "hasDynamicHelp": false,
4041
4209
  "multiple": false,
4042
- "options": [
4043
- "ad",
4044
- "ad-group",
4045
- "campaign",
4046
- "keyword"
4047
- ],
4048
4210
  "type": "option"
4049
4211
  },
4050
- "metric": {
4051
- "description": "Metric name, repeatable; cohort roots only here (revenue, roas, arpu), not their gross_/proceeds_/net_ variants; omit for every metric",
4052
- "name": "metric",
4212
+ "campaign": {
4213
+ "description": "Keep only rows in this campaign; repeatable",
4214
+ "name": "campaign",
4053
4215
  "hasDynamicHelp": false,
4054
4216
  "multiple": true,
4055
4217
  "type": "option"
4056
4218
  },
4057
- "period-unit": {
4058
- "description": "Bucket size",
4059
- "name": "period-unit",
4060
- "default": "day",
4219
+ "ad-group": {
4220
+ "description": "Keep only rows in this ad group; repeatable",
4221
+ "name": "ad-group",
4061
4222
  "hasDynamicHelp": false,
4062
- "multiple": false,
4063
- "options": [
4064
- "day",
4065
- "month",
4066
- "quarter",
4067
- "week",
4068
- "year"
4069
- ],
4223
+ "multiple": true,
4070
4224
  "type": "option"
4225
+ },
4226
+ "campaign-level-only": {
4227
+ "description": "Keep only campaign-level rows (ad_group_id is null)",
4228
+ "name": "campaign-level-only",
4229
+ "allowNo": false,
4230
+ "type": "boolean"
4071
4231
  }
4072
4232
  },
4073
4233
  "hasDynamicHelp": false,
4074
4234
  "hiddenAliases": [],
4075
- "id": "asa:metrics:overview",
4235
+ "id": "asa:negative-keywords:list",
4076
4236
  "pluginAlias": "adapty",
4077
4237
  "pluginName": "adapty",
4078
4238
  "pluginType": "core",
@@ -4083,16 +4243,17 @@
4083
4243
  "dist",
4084
4244
  "commands",
4085
4245
  "asa",
4086
- "metrics",
4087
- "overview.js"
4246
+ "negative-keywords",
4247
+ "list.js"
4088
4248
  ]
4089
4249
  },
4090
- "asa:orgs:list": {
4250
+ "asa:search-terms:list": {
4091
4251
  "aliases": [],
4092
4252
  "args": {},
4093
- "description": "List the Apple Search Ads organizations this company can spend from",
4253
+ "description": "List the search terms your ads matched, with their metrics",
4094
4254
  "examples": [
4095
- "<%= config.bin %> asa orgs list"
4255
+ "<%= config.bin %> asa search-terms list --date-from 2026-07-01 --date-to 2026-07-31",
4256
+ "<%= config.bin %> asa search-terms list --ad-group AD_GROUP_UUID"
4096
4257
  ],
4097
4258
  "flags": {
4098
4259
  "json": {
@@ -4117,11 +4278,60 @@
4117
4278
  "hasDynamicHelp": false,
4118
4279
  "multiple": false,
4119
4280
  "type": "option"
4281
+ },
4282
+ "date-from": {
4283
+ "description": "Start of the reporting period (YYYY-MM-DD), defaults to today",
4284
+ "name": "date-from",
4285
+ "hasDynamicHelp": false,
4286
+ "multiple": false,
4287
+ "type": "option"
4288
+ },
4289
+ "date-to": {
4290
+ "description": "End of the reporting period (YYYY-MM-DD), defaults to today",
4291
+ "name": "date-to",
4292
+ "hasDynamicHelp": false,
4293
+ "multiple": false,
4294
+ "type": "option"
4295
+ },
4296
+ "app": {
4297
+ "description": "Keep only rows in this app; repeatable",
4298
+ "name": "app",
4299
+ "hasDynamicHelp": false,
4300
+ "multiple": true,
4301
+ "type": "option"
4302
+ },
4303
+ "campaign-group": {
4304
+ "description": "Keep only rows in this campaign group; repeatable",
4305
+ "name": "campaign-group",
4306
+ "hasDynamicHelp": false,
4307
+ "multiple": true,
4308
+ "type": "option"
4309
+ },
4310
+ "search": {
4311
+ "description": "Case-insensitive substring match on the name",
4312
+ "name": "search",
4313
+ "hasDynamicHelp": false,
4314
+ "multiple": false,
4315
+ "type": "option"
4316
+ },
4317
+ "campaign": {
4318
+ "description": "Keep only rows in this campaign; repeatable",
4319
+ "name": "campaign",
4320
+ "hasDynamicHelp": false,
4321
+ "multiple": true,
4322
+ "type": "option"
4323
+ },
4324
+ "ad-group": {
4325
+ "description": "Keep only rows in this ad group; repeatable",
4326
+ "name": "ad-group",
4327
+ "hasDynamicHelp": false,
4328
+ "multiple": true,
4329
+ "type": "option"
4120
4330
  }
4121
4331
  },
4122
4332
  "hasDynamicHelp": false,
4123
4333
  "hiddenAliases": [],
4124
- "id": "asa:orgs:list",
4334
+ "id": "asa:search-terms:list",
4125
4335
  "pluginAlias": "adapty",
4126
4336
  "pluginName": "adapty",
4127
4337
  "pluginType": "core",
@@ -4132,7 +4342,7 @@
4132
4342
  "dist",
4133
4343
  "commands",
4134
4344
  "asa",
4135
- "orgs",
4345
+ "search-terms",
4136
4346
  "list.js"
4137
4347
  ]
4138
4348
  },
@@ -4255,91 +4465,39 @@
4255
4465
  "sync.js"
4256
4466
  ]
4257
4467
  },
4258
- "asa:search-terms:list": {
4468
+ "flows:media:upload": {
4259
4469
  "aliases": [],
4260
- "args": {},
4261
- "description": "List the search terms your ads matched, with their metrics",
4262
- "examples": [
4263
- "<%= config.bin %> asa search-terms list --date-from 2026-07-01 --date-to 2026-07-31",
4264
- "<%= config.bin %> asa search-terms list --ad-group AD_GROUP_UUID"
4265
- ],
4266
- "flags": {
4267
- "json": {
4268
- "description": "Format output as json.",
4269
- "helpGroup": "GLOBAL",
4270
- "name": "json",
4271
- "allowNo": false,
4272
- "type": "boolean"
4273
- },
4274
- "page": {
4275
- "description": "Page number",
4276
- "name": "page",
4277
- "default": 1,
4278
- "hasDynamicHelp": false,
4279
- "multiple": false,
4280
- "type": "option"
4281
- },
4282
- "page-size": {
4283
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4284
- "name": "page-size",
4285
- "default": 100,
4286
- "hasDynamicHelp": false,
4287
- "multiple": false,
4288
- "type": "option"
4289
- },
4290
- "date-from": {
4291
- "description": "Start of the reporting period (YYYY-MM-DD), defaults to today",
4292
- "name": "date-from",
4293
- "hasDynamicHelp": false,
4294
- "multiple": false,
4295
- "type": "option"
4296
- },
4297
- "date-to": {
4298
- "description": "End of the reporting period (YYYY-MM-DD), defaults to today",
4299
- "name": "date-to",
4300
- "hasDynamicHelp": false,
4301
- "multiple": false,
4302
- "type": "option"
4470
+ "args": {
4471
+ "file": {
4472
+ "description": "Path to the image file to upload",
4473
+ "name": "file",
4474
+ "required": true
4475
+ }
4476
+ },
4477
+ "description": "Upload an image as a flow builder asset; prints the CDN URL to reference from a flow config",
4478
+ "examples": [
4479
+ "<%= config.bin %> flows media upload --app UUID ./onboarding-hero.png"
4480
+ ],
4481
+ "flags": {
4482
+ "json": {
4483
+ "description": "Format output as json.",
4484
+ "helpGroup": "GLOBAL",
4485
+ "name": "json",
4486
+ "allowNo": false,
4487
+ "type": "boolean"
4303
4488
  },
4304
4489
  "app": {
4305
- "description": "Keep only rows in this app; repeatable",
4490
+ "description": "App ID (UUID)",
4306
4491
  "name": "app",
4307
- "hasDynamicHelp": false,
4308
- "multiple": true,
4309
- "type": "option"
4310
- },
4311
- "campaign-group": {
4312
- "description": "Keep only rows in this campaign group; repeatable",
4313
- "name": "campaign-group",
4314
- "hasDynamicHelp": false,
4315
- "multiple": true,
4316
- "type": "option"
4317
- },
4318
- "search": {
4319
- "description": "Case-insensitive substring match on the name",
4320
- "name": "search",
4492
+ "required": true,
4321
4493
  "hasDynamicHelp": false,
4322
4494
  "multiple": false,
4323
4495
  "type": "option"
4324
- },
4325
- "campaign": {
4326
- "description": "Keep only rows in this campaign; repeatable",
4327
- "name": "campaign",
4328
- "hasDynamicHelp": false,
4329
- "multiple": true,
4330
- "type": "option"
4331
- },
4332
- "ad-group": {
4333
- "description": "Keep only rows in this ad group; repeatable",
4334
- "name": "ad-group",
4335
- "hasDynamicHelp": false,
4336
- "multiple": true,
4337
- "type": "option"
4338
4496
  }
4339
4497
  },
4340
4498
  "hasDynamicHelp": false,
4341
4499
  "hiddenAliases": [],
4342
- "id": "asa:search-terms:list",
4500
+ "id": "flows:media:upload",
4343
4501
  "pluginAlias": "adapty",
4344
4502
  "pluginName": "adapty",
4345
4503
  "pluginType": "core",
@@ -4349,9 +4507,9 @@
4349
4507
  "relativePath": [
4350
4508
  "dist",
4351
4509
  "commands",
4352
- "asa",
4353
- "search-terms",
4354
- "list.js"
4510
+ "flows",
4511
+ "media",
4512
+ "upload.js"
4355
4513
  ]
4356
4514
  },
4357
4515
  "flows:config:get": {
@@ -4570,221 +4728,24 @@
4570
4728
  "allowNo": false,
4571
4729
  "type": "boolean"
4572
4730
  },
4573
- "app": {
4574
- "description": "App ID (UUID)",
4575
- "name": "app",
4576
- "required": true,
4577
- "hasDynamicHelp": false,
4578
- "multiple": false,
4579
- "type": "option"
4580
- },
4581
- "config": {
4582
- "description": "Builder config as a JSON string",
4583
- "name": "config",
4584
- "hasDynamicHelp": false,
4585
- "multiple": false,
4586
- "type": "option"
4587
- },
4588
- "config-file": {
4589
- "description": "JSON file with the builder config, or - to read stdin",
4590
- "name": "config-file",
4591
- "hasDynamicHelp": false,
4592
- "multiple": false,
4593
- "type": "option"
4594
- }
4595
- },
4596
- "hasDynamicHelp": false,
4597
- "hiddenAliases": [],
4598
- "id": "flows:config:validate",
4599
- "pluginAlias": "adapty",
4600
- "pluginName": "adapty",
4601
- "pluginType": "core",
4602
- "strict": true,
4603
- "enableJsonFlag": true,
4604
- "isESM": true,
4605
- "relativePath": [
4606
- "dist",
4607
- "commands",
4608
- "flows",
4609
- "config",
4610
- "validate.js"
4611
- ]
4612
- },
4613
- "flows:media:upload": {
4614
- "aliases": [],
4615
- "args": {
4616
- "file": {
4617
- "description": "Path to the image file to upload",
4618
- "name": "file",
4619
- "required": true
4620
- }
4621
- },
4622
- "description": "Upload an image as a flow builder asset; prints the CDN URL to reference from a flow config",
4623
- "examples": [
4624
- "<%= config.bin %> flows media upload --app UUID ./onboarding-hero.png"
4625
- ],
4626
- "flags": {
4627
- "json": {
4628
- "description": "Format output as json.",
4629
- "helpGroup": "GLOBAL",
4630
- "name": "json",
4631
- "allowNo": false,
4632
- "type": "boolean"
4633
- },
4634
- "app": {
4635
- "description": "App ID (UUID)",
4636
- "name": "app",
4637
- "required": true,
4638
- "hasDynamicHelp": false,
4639
- "multiple": false,
4640
- "type": "option"
4641
- }
4642
- },
4643
- "hasDynamicHelp": false,
4644
- "hiddenAliases": [],
4645
- "id": "flows:media:upload",
4646
- "pluginAlias": "adapty",
4647
- "pluginName": "adapty",
4648
- "pluginType": "core",
4649
- "strict": true,
4650
- "enableJsonFlag": true,
4651
- "isESM": true,
4652
- "relativePath": [
4653
- "dist",
4654
- "commands",
4655
- "flows",
4656
- "media",
4657
- "upload.js"
4658
- ]
4659
- },
4660
- "asa:automations:create": {
4661
- "aliases": [],
4662
- "args": {},
4663
- "description": "Create an automation rule from a JSON rule file",
4664
- "examples": [
4665
- "<%= config.bin %> asa automations create --file rule.json",
4666
- "<%= config.bin %> asa automations create --file rule.json --run-now"
4667
- ],
4668
- "flags": {
4669
- "json": {
4670
- "description": "Format output as json.",
4671
- "helpGroup": "GLOBAL",
4672
- "name": "json",
4673
- "allowNo": false,
4674
- "type": "boolean"
4675
- },
4676
- "yes": {
4677
- "char": "y",
4678
- "description": "Apply without asking; required when the output is piped or --json is used",
4679
- "name": "yes",
4680
- "allowNo": false,
4681
- "type": "boolean"
4682
- },
4683
- "idempotency-key": {
4684
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4685
- "name": "idempotency-key",
4686
- "hasDynamicHelp": false,
4687
- "multiple": false,
4688
- "type": "option"
4689
- },
4690
- "file": {
4691
- "description": "JSON file with the rule body, or - to read stdin",
4692
- "name": "file",
4693
- "required": true,
4694
- "hasDynamicHelp": false,
4695
- "multiple": false,
4696
- "type": "option"
4697
- },
4698
- "run-now": {
4699
- "description": "Queue the first run right after the rule is stored",
4700
- "name": "run-now",
4701
- "allowNo": false,
4702
- "type": "boolean"
4703
- }
4704
- },
4705
- "hasDynamicHelp": false,
4706
- "hiddenAliases": [],
4707
- "id": "asa:automations:create",
4708
- "pluginAlias": "adapty",
4709
- "pluginName": "adapty",
4710
- "pluginType": "core",
4711
- "strict": true,
4712
- "enableJsonFlag": true,
4713
- "isESM": true,
4714
- "relativePath": [
4715
- "dist",
4716
- "commands",
4717
- "asa",
4718
- "automations",
4719
- "create.js"
4720
- ]
4721
- },
4722
- "asa:automations:get": {
4723
- "aliases": [],
4724
- "args": {
4725
- "automation_id": {
4726
- "description": "Automation rule ID (UUID)",
4727
- "name": "automation_id",
4728
- "required": true
4729
- }
4730
- },
4731
- "description": "Show one automation rule with its conditions and actions",
4732
- "examples": [
4733
- "<%= config.bin %> asa automations get 550e8400-e29b-41d4-a716-446655440000"
4734
- ],
4735
- "flags": {
4736
- "json": {
4737
- "description": "Format output as json.",
4738
- "helpGroup": "GLOBAL",
4739
- "name": "json",
4740
- "allowNo": false,
4741
- "type": "boolean"
4742
- }
4743
- },
4744
- "hasDynamicHelp": false,
4745
- "hiddenAliases": [],
4746
- "id": "asa:automations:get",
4747
- "pluginAlias": "adapty",
4748
- "pluginName": "adapty",
4749
- "pluginType": "core",
4750
- "strict": true,
4751
- "enableJsonFlag": true,
4752
- "isESM": true,
4753
- "relativePath": [
4754
- "dist",
4755
- "commands",
4756
- "asa",
4757
- "automations",
4758
- "get.js"
4759
- ]
4760
- },
4761
- "asa:automations:list": {
4762
- "aliases": [],
4763
- "args": {},
4764
- "description": "List automation rules; status 1 is active, 0 is stopped",
4765
- "examples": [
4766
- "<%= config.bin %> asa automations list"
4767
- ],
4768
- "flags": {
4769
- "json": {
4770
- "description": "Format output as json.",
4771
- "helpGroup": "GLOBAL",
4772
- "name": "json",
4773
- "allowNo": false,
4774
- "type": "boolean"
4775
- },
4776
- "page": {
4777
- "description": "Page number",
4778
- "name": "page",
4779
- "default": 1,
4731
+ "app": {
4732
+ "description": "App ID (UUID)",
4733
+ "name": "app",
4734
+ "required": true,
4780
4735
  "hasDynamicHelp": false,
4781
4736
  "multiple": false,
4782
4737
  "type": "option"
4783
4738
  },
4784
- "page-size": {
4785
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4786
- "name": "page-size",
4787
- "default": 100,
4739
+ "config": {
4740
+ "description": "Builder config as a JSON string",
4741
+ "name": "config",
4742
+ "hasDynamicHelp": false,
4743
+ "multiple": false,
4744
+ "type": "option"
4745
+ },
4746
+ "config-file": {
4747
+ "description": "JSON file with the builder config, or - to read stdin",
4748
+ "name": "config-file",
4788
4749
  "hasDynamicHelp": false,
4789
4750
  "multiple": false,
4790
4751
  "type": "option"
@@ -4792,7 +4753,7 @@
4792
4753
  },
4793
4754
  "hasDynamicHelp": false,
4794
4755
  "hiddenAliases": [],
4795
- "id": "asa:automations:list",
4756
+ "id": "flows:config:validate",
4796
4757
  "pluginAlias": "adapty",
4797
4758
  "pluginName": "adapty",
4798
4759
  "pluginType": "core",
@@ -4802,24 +4763,18 @@
4802
4763
  "relativePath": [
4803
4764
  "dist",
4804
4765
  "commands",
4805
- "asa",
4806
- "automations",
4807
- "list.js"
4766
+ "flows",
4767
+ "config",
4768
+ "validate.js"
4808
4769
  ]
4809
4770
  },
4810
- "asa:automations:run": {
4771
+ "asa:keywords:add": {
4811
4772
  "aliases": [],
4812
- "args": {
4813
- "automation_id": {
4814
- "description": "Automation rule ID (UUID)",
4815
- "name": "automation_id",
4816
- "required": true
4817
- }
4818
- },
4819
- "description": "Run an automation rule now; the run is queued, not awaited",
4773
+ "args": {},
4774
+ "description": "Add targeting keywords to an ad group",
4820
4775
  "examples": [
4821
- "<%= config.bin %> asa automations run UUID",
4822
- "<%= config.bin %> asa automations run UUID --dry-run"
4776
+ "<%= config.bin %> asa keywords add --ad-group UUID --text \"running shoes\" --text \"trail shoes\" --bid 1.20",
4777
+ "<%= config.bin %> asa keywords add --ad-group UUID --from-file keywords.txt --match-type EXACT"
4823
4778
  ],
4824
4779
  "flags": {
4825
4780
  "json": {
@@ -4829,6 +4784,14 @@
4829
4784
  "allowNo": false,
4830
4785
  "type": "boolean"
4831
4786
  },
4787
+ "currency": {
4788
+ "description": "Currency code for the amounts in this call",
4789
+ "name": "currency",
4790
+ "default": "USD",
4791
+ "hasDynamicHelp": false,
4792
+ "multiple": false,
4793
+ "type": "option"
4794
+ },
4832
4795
  "yes": {
4833
4796
  "char": "y",
4834
4797
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -4843,16 +4806,63 @@
4843
4806
  "multiple": false,
4844
4807
  "type": "option"
4845
4808
  },
4846
- "dry-run": {
4847
- "description": "Evaluate and log the rule without touching Apple",
4848
- "name": "dry-run",
4849
- "allowNo": false,
4850
- "type": "boolean"
4809
+ "ad-group": {
4810
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
4811
+ "name": "ad-group",
4812
+ "required": true,
4813
+ "hasDynamicHelp": false,
4814
+ "multiple": false,
4815
+ "type": "option"
4816
+ },
4817
+ "bid": {
4818
+ "description": "Bid per keyword (amount, e.g. 50 or 12.50)",
4819
+ "name": "bid",
4820
+ "hasDynamicHelp": false,
4821
+ "multiple": false,
4822
+ "type": "option"
4823
+ },
4824
+ "from-file": {
4825
+ "description": "File with one keyword per line, combined with any --text values",
4826
+ "name": "from-file",
4827
+ "hasDynamicHelp": false,
4828
+ "multiple": false,
4829
+ "type": "option"
4830
+ },
4831
+ "match-type": {
4832
+ "description": "Match type",
4833
+ "name": "match-type",
4834
+ "default": "BROAD",
4835
+ "hasDynamicHelp": false,
4836
+ "multiple": false,
4837
+ "options": [
4838
+ "BROAD",
4839
+ "EXACT"
4840
+ ],
4841
+ "type": "option"
4842
+ },
4843
+ "status": {
4844
+ "description": "Keyword status",
4845
+ "name": "status",
4846
+ "default": "ACTIVE",
4847
+ "hasDynamicHelp": false,
4848
+ "multiple": false,
4849
+ "options": [
4850
+ "ACTIVE",
4851
+ "PAUSED"
4852
+ ],
4853
+ "type": "option"
4854
+ },
4855
+ "text": {
4856
+ "description": "Keyword text, repeatable",
4857
+ "name": "text",
4858
+ "hasDynamicHelp": false,
4859
+ "multiple": true,
4860
+ "type": "option"
4851
4861
  }
4852
4862
  },
4853
4863
  "hasDynamicHelp": false,
4854
4864
  "hiddenAliases": [],
4855
- "id": "asa:automations:run",
4865
+ "id": "asa:keywords:add",
4856
4866
  "pluginAlias": "adapty",
4857
4867
  "pluginName": "adapty",
4858
4868
  "pluginType": "core",
@@ -4863,22 +4873,17 @@
4863
4873
  "dist",
4864
4874
  "commands",
4865
4875
  "asa",
4866
- "automations",
4867
- "run.js"
4876
+ "keywords",
4877
+ "add.js"
4868
4878
  ]
4869
4879
  },
4870
- "asa:automations:runs": {
4880
+ "asa:keywords:list": {
4871
4881
  "aliases": [],
4872
- "args": {
4873
- "automation_id": {
4874
- "description": "Automation rule ID (UUID)",
4875
- "name": "automation_id",
4876
- "required": true
4877
- }
4878
- },
4879
- "description": "List past runs of an automation rule, including dry runs",
4882
+ "args": {},
4883
+ "description": "List targeting keywords; read numbers with asa metrics",
4880
4884
  "examples": [
4881
- "<%= config.bin %> asa automations runs 550e8400-e29b-41d4-a716-446655440000"
4885
+ "<%= config.bin %> asa keywords list",
4886
+ "<%= config.bin %> asa keywords list --ad-group AD_GROUP_UUID --status ACTIVE"
4882
4887
  ],
4883
4888
  "flags": {
4884
4889
  "json": {
@@ -4903,11 +4908,57 @@
4903
4908
  "hasDynamicHelp": false,
4904
4909
  "multiple": false,
4905
4910
  "type": "option"
4911
+ },
4912
+ "app": {
4913
+ "description": "Keep only rows in this app; repeatable",
4914
+ "name": "app",
4915
+ "hasDynamicHelp": false,
4916
+ "multiple": true,
4917
+ "type": "option"
4918
+ },
4919
+ "campaign-group": {
4920
+ "description": "Keep only rows in this campaign group; repeatable",
4921
+ "name": "campaign-group",
4922
+ "hasDynamicHelp": false,
4923
+ "multiple": true,
4924
+ "type": "option"
4925
+ },
4926
+ "search": {
4927
+ "description": "Case-insensitive substring match on the name",
4928
+ "name": "search",
4929
+ "hasDynamicHelp": false,
4930
+ "multiple": false,
4931
+ "type": "option"
4932
+ },
4933
+ "campaign": {
4934
+ "description": "Keep only rows in this campaign; repeatable",
4935
+ "name": "campaign",
4936
+ "hasDynamicHelp": false,
4937
+ "multiple": true,
4938
+ "type": "option"
4939
+ },
4940
+ "ad-group": {
4941
+ "description": "Keep only rows in this ad group; repeatable",
4942
+ "name": "ad-group",
4943
+ "hasDynamicHelp": false,
4944
+ "multiple": true,
4945
+ "type": "option"
4946
+ },
4947
+ "status": {
4948
+ "description": "Keep only rows in this state",
4949
+ "name": "status",
4950
+ "hasDynamicHelp": false,
4951
+ "multiple": false,
4952
+ "options": [
4953
+ "ACTIVE",
4954
+ "PAUSED"
4955
+ ],
4956
+ "type": "option"
4906
4957
  }
4907
4958
  },
4908
4959
  "hasDynamicHelp": false,
4909
4960
  "hiddenAliases": [],
4910
- "id": "asa:automations:runs",
4961
+ "id": "asa:keywords:list",
4911
4962
  "pluginAlias": "adapty",
4912
4963
  "pluginName": "adapty",
4913
4964
  "pluginType": "core",
@@ -4918,23 +4969,23 @@
4918
4969
  "dist",
4919
4970
  "commands",
4920
4971
  "asa",
4921
- "automations",
4922
- "runs.js"
4972
+ "keywords",
4973
+ "list.js"
4923
4974
  ]
4924
4975
  },
4925
- "asa:automations:update": {
4976
+ "asa:keywords:update": {
4926
4977
  "aliases": [],
4927
4978
  "args": {
4928
- "automation_id": {
4929
- "description": "Automation rule ID (UUID)",
4930
- "name": "automation_id",
4979
+ "keyword_id": {
4980
+ "description": "Keyword ID (UUID), repeatable as extra arguments",
4981
+ "name": "keyword_id",
4931
4982
  "required": true
4932
4983
  }
4933
4984
  },
4934
- "description": "Change an automation rule: stop it, rename it, or replace parts of the rule",
4985
+ "description": "Change bid, status, text or match type of keywords",
4935
4986
  "examples": [
4936
- "<%= config.bin %> asa automations update UUID --stop",
4937
- "<%= config.bin %> asa automations update UUID --file rule.json"
4987
+ "<%= config.bin %> asa keywords update UUID --bid 2.00",
4988
+ "<%= config.bin %> asa keywords update UUID_A UUID_B --status PAUSED"
4938
4989
  ],
4939
4990
  "flags": {
4940
4991
  "json": {
@@ -4944,6 +4995,14 @@
4944
4995
  "allowNo": false,
4945
4996
  "type": "boolean"
4946
4997
  },
4998
+ "currency": {
4999
+ "description": "Currency code for the amounts in this call",
5000
+ "name": "currency",
5001
+ "default": "USD",
5002
+ "hasDynamicHelp": false,
5003
+ "multiple": false,
5004
+ "type": "option"
5005
+ },
4947
5006
  "yes": {
4948
5007
  "char": "y",
4949
5008
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -4958,56 +5017,60 @@
4958
5017
  "multiple": false,
4959
5018
  "type": "option"
4960
5019
  },
4961
- "file": {
4962
- "description": "JSON file with the parts to change, or - to read stdin",
4963
- "name": "file",
5020
+ "bid": {
5021
+ "description": "Bid (amount, e.g. 50 or 12.50)",
5022
+ "name": "bid",
4964
5023
  "hasDynamicHelp": false,
4965
5024
  "multiple": false,
4966
5025
  "type": "option"
4967
5026
  },
4968
- "name": {
4969
- "description": "Rule name",
4970
- "name": "name",
5027
+ "match-type": {
5028
+ "description": "Match type",
5029
+ "name": "match-type",
4971
5030
  "hasDynamicHelp": false,
4972
5031
  "multiple": false,
5032
+ "options": [
5033
+ "BROAD",
5034
+ "EXACT"
5035
+ ],
4973
5036
  "type": "option"
4974
5037
  },
4975
- "start": {
4976
- "description": "Activate the rule",
4977
- "exclusive": [
4978
- "stop"
5038
+ "status": {
5039
+ "description": "Keyword status",
5040
+ "name": "status",
5041
+ "hasDynamicHelp": false,
5042
+ "multiple": false,
5043
+ "options": [
5044
+ "ACTIVE",
5045
+ "PAUSED"
4979
5046
  ],
4980
- "name": "start",
4981
- "allowNo": false,
4982
- "type": "boolean"
5047
+ "type": "option"
4983
5048
  },
4984
- "stop": {
4985
- "description": "Stop the rule and clear its next run",
4986
- "exclusive": [
4987
- "start"
4988
- ],
4989
- "name": "stop",
4990
- "allowNo": false,
4991
- "type": "boolean"
5049
+ "text": {
5050
+ "description": "Keyword text (only meaningful for a single keyword)",
5051
+ "name": "text",
5052
+ "hasDynamicHelp": false,
5053
+ "multiple": false,
5054
+ "type": "option"
4992
5055
  }
4993
5056
  },
4994
5057
  "hasDynamicHelp": false,
4995
5058
  "hiddenAliases": [],
4996
- "id": "asa:automations:update",
5059
+ "id": "asa:keywords:update",
4997
5060
  "pluginAlias": "adapty",
4998
5061
  "pluginName": "adapty",
4999
5062
  "pluginType": "core",
5000
- "strict": true,
5063
+ "strict": false,
5001
5064
  "enableJsonFlag": true,
5002
5065
  "isESM": true,
5003
5066
  "relativePath": [
5004
5067
  "dist",
5005
5068
  "commands",
5006
5069
  "asa",
5007
- "automations",
5070
+ "keywords",
5008
5071
  "update.js"
5009
5072
  ]
5010
5073
  }
5011
5074
  },
5012
- "version": "0.8.3-beta.1"
5075
+ "version": "0.8.3"
5013
5076
  }