adapty 0.8.3-beta.0 → 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 +1273 -1210
  29. package/package.json +2 -3
  30. package/dist/commands/flows/publish.d.ts +0 -15
  31. package/dist/commands/flows/publish.js +0 -34
  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,13 +2370,65 @@
2529
2370
  "update.js"
2530
2371
  ]
2531
2372
  },
2373
+ "asa:apps:list": {
2374
+ "aliases": [],
2375
+ "args": {},
2376
+ "description": "List the apps promoted by this company in Apple Search Ads",
2377
+ "examples": [
2378
+ "<%= config.bin %> asa apps list",
2379
+ "<%= config.bin %> asa apps list --page 2 --page-size 50"
2380
+ ],
2381
+ "flags": {
2382
+ "json": {
2383
+ "description": "Format output as json.",
2384
+ "helpGroup": "GLOBAL",
2385
+ "name": "json",
2386
+ "allowNo": false,
2387
+ "type": "boolean"
2388
+ },
2389
+ "page": {
2390
+ "description": "Page number",
2391
+ "name": "page",
2392
+ "default": 1,
2393
+ "hasDynamicHelp": false,
2394
+ "multiple": false,
2395
+ "type": "option"
2396
+ },
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,
2401
+ "hasDynamicHelp": false,
2402
+ "multiple": false,
2403
+ "type": "option"
2404
+ }
2405
+ },
2406
+ "hasDynamicHelp": false,
2407
+ "hiddenAliases": [],
2408
+ "id": "asa:apps:list",
2409
+ "pluginAlias": "adapty",
2410
+ "pluginName": "adapty",
2411
+ "pluginType": "core",
2412
+ "strict": true,
2413
+ "enableJsonFlag": true,
2414
+ "isESM": true,
2415
+ "relativePath": [
2416
+ "dist",
2417
+ "commands",
2418
+ "asa",
2419
+ "apps",
2420
+ "list.js"
2421
+ ]
2422
+ },
2532
2423
  "asa:automations:create": {
2533
2424
  "aliases": [],
2534
2425
  "args": {},
2535
- "description": "Create an automation rule from a JSON rule file",
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.",
2536
2427
  "examples": [
2537
2428
  "<%= config.bin %> asa automations create --file rule.json",
2538
- "<%= config.bin %> asa automations create --file rule.json --run-now"
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"
2539
2432
  ],
2540
2433
  "flags": {
2541
2434
  "json": {
@@ -2545,6 +2438,79 @@
2545
2438
  "allowNo": false,
2546
2439
  "type": "boolean"
2547
2440
  },
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",
2444
+ "hasDynamicHelp": false,
2445
+ "multiple": false,
2446
+ "type": "option"
2447
+ },
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",
2451
+ "hasDynamicHelp": false,
2452
+ "multiple": false,
2453
+ "options": [
2454
+ "ad_group_default_bid",
2455
+ "keyword_current_bid",
2456
+ "search_term_current_cpt",
2457
+ "set_to"
2458
+ ],
2459
+ "type": "option"
2460
+ },
2461
+ "match-type": {
2462
+ "description": "Match type of the created keyword; the API has no default",
2463
+ "name": "match-type",
2464
+ "hasDynamicHelp": false,
2465
+ "multiple": false,
2466
+ "options": [
2467
+ "BROAD",
2468
+ "EXACT"
2469
+ ],
2470
+ "type": "option"
2471
+ },
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",
2478
+ "hasDynamicHelp": false,
2479
+ "multiple": false,
2480
+ "options": [
2481
+ "ad-group",
2482
+ "campaign"
2483
+ ],
2484
+ "type": "option"
2485
+ },
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
+ },
2548
2514
  "yes": {
2549
2515
  "char": "y",
2550
2516
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2803,10 +2769,11 @@
2803
2769
  "required": true
2804
2770
  }
2805
2771
  },
2806
- "description": "Change an automation rule: stop it, rename it, or replace parts of the rule",
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.",
2807
2773
  "examples": [
2808
2774
  "<%= config.bin %> asa automations update UUID --stop",
2809
- "<%= config.bin %> asa automations update UUID --file rule.json"
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"
2810
2777
  ],
2811
2778
  "flags": {
2812
2779
  "json": {
@@ -2816,6 +2783,79 @@
2816
2783
  "allowNo": false,
2817
2784
  "type": "boolean"
2818
2785
  },
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",
2789
+ "hasDynamicHelp": false,
2790
+ "multiple": false,
2791
+ "type": "option"
2792
+ },
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",
2796
+ "hasDynamicHelp": false,
2797
+ "multiple": false,
2798
+ "options": [
2799
+ "ad_group_default_bid",
2800
+ "keyword_current_bid",
2801
+ "search_term_current_cpt",
2802
+ "set_to"
2803
+ ],
2804
+ "type": "option"
2805
+ },
2806
+ "match-type": {
2807
+ "description": "Match type of the created keyword; the API has no default",
2808
+ "name": "match-type",
2809
+ "hasDynamicHelp": false,
2810
+ "multiple": false,
2811
+ "options": [
2812
+ "BROAD",
2813
+ "EXACT"
2814
+ ],
2815
+ "type": "option"
2816
+ },
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",
2823
+ "hasDynamicHelp": false,
2824
+ "multiple": false,
2825
+ "options": [
2826
+ "ad-group",
2827
+ "campaign"
2828
+ ],
2829
+ "type": "option"
2830
+ },
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",
2855
+ "hasDynamicHelp": false,
2856
+ "multiple": true,
2857
+ "type": "option"
2858
+ },
2819
2859
  "yes": {
2820
2860
  "char": "y",
2821
2861
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2880,12 +2920,15 @@
2880
2920
  "update.js"
2881
2921
  ]
2882
2922
  },
2883
- "asa:competitors:summary": {
2923
+ "asa:campaigns:bulk-create": {
2884
2924
  "aliases": [],
2885
2925
  "args": {},
2886
- "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
2926
+ "description": "Create a whole campaign structure (campaigns → ad groups → keywords/negative keywords/ads) in one bulk operation",
2887
2927
  "examples": [
2888
- "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
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"
2889
2932
  ],
2890
2933
  "flags": {
2891
2934
  "json": {
@@ -2895,18 +2938,73 @@
2895
2938
  "allowNo": false,
2896
2939
  "type": "boolean"
2897
2940
  },
2898
- "app-ids": {
2899
- "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
2900
- "name": "app-ids",
2901
- "required": true,
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",
2951
+ "hasDynamicHelp": false,
2952
+ "multiple": false,
2953
+ "type": "option"
2954
+ },
2955
+ "file": {
2956
+ "description": "JSON file with the campaign structure (the POST /bulk-operations/ body); use \"-\" for stdin",
2957
+ "name": "file",
2958
+ "hasDynamicHelp": false,
2959
+ "multiple": false,
2960
+ "type": "option"
2961
+ },
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",
2965
+ "hasDynamicHelp": false,
2966
+ "multiple": false,
2967
+ "type": "option"
2968
+ },
2969
+ "org-id": {
2970
+ "description": "Apple org id (campaign_group_id) the converted template will target; required with --from-file",
2971
+ "name": "org-id",
2972
+ "hasDynamicHelp": false,
2973
+ "multiple": false,
2974
+ "type": "option"
2975
+ },
2976
+ "poll-interval": {
2977
+ "description": "Seconds between progress polls",
2978
+ "name": "poll-interval",
2979
+ "default": 5,
2980
+ "hasDynamicHelp": false,
2981
+ "multiple": false,
2982
+ "type": "option"
2983
+ },
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,
2902
2994
  "hasDynamicHelp": false,
2903
2995
  "multiple": false,
2904
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"
2905
3003
  }
2906
3004
  },
2907
3005
  "hasDynamicHelp": false,
2908
3006
  "hiddenAliases": [],
2909
- "id": "asa:competitors:summary",
3007
+ "id": "asa:campaigns:bulk-create",
2910
3008
  "pluginAlias": "adapty",
2911
3009
  "pluginName": "adapty",
2912
3010
  "pluginType": "core",
@@ -2917,17 +3015,18 @@
2917
3015
  "dist",
2918
3016
  "commands",
2919
3017
  "asa",
2920
- "competitors",
2921
- "summary.js"
3018
+ "campaigns",
3019
+ "bulk-create.js"
2922
3020
  ]
2923
3021
  },
2924
- "asa:creatives:list": {
3022
+ "asa:campaigns:bulk-list": {
2925
3023
  "aliases": [],
2926
3024
  "args": {},
2927
- "description": "List creatives; creative_id is what `asa ads create` needs",
3025
+ "description": "This company's bulk operations, newest first; inspect one with bulk-status",
2928
3026
  "examples": [
2929
- "<%= config.bin %> asa creatives list",
2930
- "<%= config.bin %> asa creatives list --app APP_UUID"
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"
2931
3030
  ],
2932
3031
  "flags": {
2933
3032
  "json": {
@@ -2954,132 +3053,44 @@
2954
3053
  "type": "option"
2955
3054
  },
2956
3055
  "app": {
2957
- "description": "Keep only rows in this app; repeatable",
3056
+ "description": "Keep only operations of this app (UUID)",
2958
3057
  "name": "app",
2959
3058
  "hasDynamicHelp": false,
2960
- "multiple": true,
2961
- "type": "option"
2962
- },
2963
- "campaign-group": {
2964
- "description": "Keep only rows in this campaign group; repeatable",
2965
- "name": "campaign-group",
2966
- "hasDynamicHelp": false,
2967
- "multiple": true,
2968
- "type": "option"
2969
- }
2970
- },
2971
- "hasDynamicHelp": false,
2972
- "hiddenAliases": [],
2973
- "id": "asa:creatives:list",
2974
- "pluginAlias": "adapty",
2975
- "pluginName": "adapty",
2976
- "pluginType": "core",
2977
- "strict": true,
2978
- "enableJsonFlag": true,
2979
- "isESM": true,
2980
- "relativePath": [
2981
- "dist",
2982
- "commands",
2983
- "asa",
2984
- "creatives",
2985
- "list.js"
2986
- ]
2987
- },
2988
- "asa:keywords:add": {
2989
- "aliases": [],
2990
- "args": {},
2991
- "description": "Add targeting keywords to an ad group",
2992
- "examples": [
2993
- "<%= config.bin %> asa keywords add --ad-group UUID --text \"running shoes\" --text \"trail shoes\" --bid 1.20",
2994
- "<%= config.bin %> asa keywords add --ad-group UUID --from-file keywords.txt --match-type EXACT"
2995
- ],
2996
- "flags": {
2997
- "json": {
2998
- "description": "Format output as json.",
2999
- "helpGroup": "GLOBAL",
3000
- "name": "json",
3001
- "allowNo": false,
3002
- "type": "boolean"
3003
- },
3004
- "currency": {
3005
- "description": "Currency code for the amounts in this call",
3006
- "name": "currency",
3007
- "default": "USD",
3008
- "hasDynamicHelp": false,
3009
- "multiple": false,
3010
- "type": "option"
3011
- },
3012
- "yes": {
3013
- "char": "y",
3014
- "description": "Apply without asking; required when the output is piped or --json is used",
3015
- "name": "yes",
3016
- "allowNo": false,
3017
- "type": "boolean"
3018
- },
3019
- "idempotency-key": {
3020
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3021
- "name": "idempotency-key",
3022
- "hasDynamicHelp": false,
3023
- "multiple": false,
3024
- "type": "option"
3025
- },
3026
- "ad-group": {
3027
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
3028
- "name": "ad-group",
3029
- "required": true,
3030
- "hasDynamicHelp": false,
3031
- "multiple": false,
3032
- "type": "option"
3033
- },
3034
- "bid": {
3035
- "description": "Bid per keyword (amount, e.g. 50 or 12.50)",
3036
- "name": "bid",
3037
- "hasDynamicHelp": false,
3038
3059
  "multiple": false,
3039
3060
  "type": "option"
3040
3061
  },
3041
- "from-file": {
3042
- "description": "File with one keyword per line, combined with any --text values",
3043
- "name": "from-file",
3062
+ "created-from": {
3063
+ "description": "Keep only operations created on or after this date (YYYY-MM-DD)",
3064
+ "name": "created-from",
3044
3065
  "hasDynamicHelp": false,
3045
3066
  "multiple": false,
3046
3067
  "type": "option"
3047
3068
  },
3048
- "match-type": {
3049
- "description": "Match type",
3050
- "name": "match-type",
3051
- "default": "BROAD",
3069
+ "created-to": {
3070
+ "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
3071
+ "name": "created-to",
3052
3072
  "hasDynamicHelp": false,
3053
3073
  "multiple": false,
3054
- "options": [
3055
- "BROAD",
3056
- "EXACT"
3057
- ],
3058
3074
  "type": "option"
3059
3075
  },
3060
3076
  "status": {
3061
- "description": "Keyword status",
3077
+ "description": "Keep only operations in this state; repeatable",
3062
3078
  "name": "status",
3063
- "default": "ACTIVE",
3064
3079
  "hasDynamicHelp": false,
3065
- "multiple": false,
3080
+ "multiple": true,
3066
3081
  "options": [
3067
- "ACTIVE",
3068
- "PAUSED"
3082
+ "failed",
3083
+ "partial",
3084
+ "pending",
3085
+ "running",
3086
+ "success"
3069
3087
  ],
3070
3088
  "type": "option"
3071
- },
3072
- "text": {
3073
- "description": "Keyword text, repeatable",
3074
- "name": "text",
3075
- "hasDynamicHelp": false,
3076
- "multiple": true,
3077
- "type": "option"
3078
3089
  }
3079
3090
  },
3080
3091
  "hasDynamicHelp": false,
3081
3092
  "hiddenAliases": [],
3082
- "id": "asa:keywords:add",
3093
+ "id": "asa:campaigns:bulk-list",
3083
3094
  "pluginAlias": "adapty",
3084
3095
  "pluginName": "adapty",
3085
3096
  "pluginType": "core",
@@ -3090,17 +3101,22 @@
3090
3101
  "dist",
3091
3102
  "commands",
3092
3103
  "asa",
3093
- "keywords",
3094
- "add.js"
3104
+ "campaigns",
3105
+ "bulk-list.js"
3095
3106
  ]
3096
3107
  },
3097
- "asa:keywords:list": {
3108
+ "asa:campaigns:bulk-status": {
3098
3109
  "aliases": [],
3099
- "args": {},
3100
- "description": "List targeting keywords; read numbers with asa metrics",
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",
3101
3118
  "examples": [
3102
- "<%= config.bin %> asa keywords list",
3103
- "<%= config.bin %> asa keywords list --ad-group AD_GROUP_UUID --status ACTIVE"
3119
+ "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
3104
3120
  ],
3105
3121
  "flags": {
3106
3122
  "json": {
@@ -3125,57 +3141,11 @@
3125
3141
  "hasDynamicHelp": false,
3126
3142
  "multiple": false,
3127
3143
  "type": "option"
3128
- },
3129
- "app": {
3130
- "description": "Keep only rows in this app; repeatable",
3131
- "name": "app",
3132
- "hasDynamicHelp": false,
3133
- "multiple": true,
3134
- "type": "option"
3135
- },
3136
- "campaign-group": {
3137
- "description": "Keep only rows in this campaign group; repeatable",
3138
- "name": "campaign-group",
3139
- "hasDynamicHelp": false,
3140
- "multiple": true,
3141
- "type": "option"
3142
- },
3143
- "search": {
3144
- "description": "Case-insensitive substring match on the name",
3145
- "name": "search",
3146
- "hasDynamicHelp": false,
3147
- "multiple": false,
3148
- "type": "option"
3149
- },
3150
- "campaign": {
3151
- "description": "Keep only rows in this campaign; repeatable",
3152
- "name": "campaign",
3153
- "hasDynamicHelp": false,
3154
- "multiple": true,
3155
- "type": "option"
3156
- },
3157
- "ad-group": {
3158
- "description": "Keep only rows in this ad group; repeatable",
3159
- "name": "ad-group",
3160
- "hasDynamicHelp": false,
3161
- "multiple": true,
3162
- "type": "option"
3163
- },
3164
- "status": {
3165
- "description": "Keep only rows in this state",
3166
- "name": "status",
3167
- "hasDynamicHelp": false,
3168
- "multiple": false,
3169
- "options": [
3170
- "ACTIVE",
3171
- "PAUSED"
3172
- ],
3173
- "type": "option"
3174
3144
  }
3175
3145
  },
3176
3146
  "hasDynamicHelp": false,
3177
3147
  "hiddenAliases": [],
3178
- "id": "asa:keywords:list",
3148
+ "id": "asa:campaigns:bulk-status",
3179
3149
  "pluginAlias": "adapty",
3180
3150
  "pluginName": "adapty",
3181
3151
  "pluginType": "core",
@@ -3186,23 +3156,18 @@
3186
3156
  "dist",
3187
3157
  "commands",
3188
3158
  "asa",
3189
- "keywords",
3190
- "list.js"
3159
+ "campaigns",
3160
+ "bulk-status.js"
3191
3161
  ]
3192
3162
  },
3193
- "asa:keywords:update": {
3163
+ "asa:campaigns:create": {
3194
3164
  "aliases": [],
3195
- "args": {
3196
- "keyword_id": {
3197
- "description": "Keyword ID (UUID), repeatable as extra arguments",
3198
- "name": "keyword_id",
3199
- "required": true
3200
- }
3201
- },
3202
- "description": "Change bid, status, text or match type of keywords",
3165
+ "args": {},
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",
3203
3167
  "examples": [
3204
- "<%= config.bin %> asa keywords update UUID --bid 2.00",
3205
- "<%= config.bin %> asa keywords update UUID_A UUID_B --status PAUSED"
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"
3206
3171
  ],
3207
3172
  "flags": {
3208
3173
  "json": {
@@ -3234,70 +3199,561 @@
3234
3199
  "multiple": false,
3235
3200
  "type": "option"
3236
3201
  },
3237
- "bid": {
3238
- "description": "Bid (amount, e.g. 50 or 12.50)",
3239
- "name": "bid",
3202
+ "invoice-advertiser": {
3203
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
3204
+ "name": "invoice-advertiser",
3240
3205
  "hasDynamicHelp": false,
3241
3206
  "multiple": false,
3242
3207
  "type": "option"
3243
3208
  },
3244
- "match-type": {
3245
- "description": "Match type",
3246
- "name": "match-type",
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",
3247
3212
  "hasDynamicHelp": false,
3248
3213
  "multiple": false,
3249
- "options": [
3250
- "BROAD",
3251
- "EXACT"
3252
- ],
3253
3214
  "type": "option"
3254
3215
  },
3255
- "status": {
3256
- "description": "Keyword status",
3257
- "name": "status",
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",
3258
3219
  "hasDynamicHelp": false,
3259
3220
  "multiple": false,
3260
- "options": [
3261
- "ACTIVE",
3262
- "PAUSED"
3263
- ],
3264
3221
  "type": "option"
3265
3222
  },
3266
- "text": {
3267
- "description": "Keyword text (only meaningful for a single keyword)",
3268
- "name": "text",
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",
3269
3226
  "hasDynamicHelp": false,
3270
3227
  "multiple": false,
3271
3228
  "type": "option"
3272
- }
3273
- },
3274
- "hasDynamicHelp": false,
3275
- "hiddenAliases": [],
3276
- "id": "asa:keywords:update",
3277
- "pluginAlias": "adapty",
3278
- "pluginName": "adapty",
3279
- "pluginType": "core",
3280
- "strict": false,
3281
- "enableJsonFlag": true,
3282
- "isESM": true,
3283
- "relativePath": [
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",
3241
+ "hasDynamicHelp": false,
3242
+ "multiple": false,
3243
+ "options": [
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"
3277
+ ],
3278
+ "type": "option"
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
+ },
3319
+ "status": {
3320
+ "description": "Initial status",
3321
+ "name": "status",
3322
+ "hasDynamicHelp": false,
3323
+ "multiple": false,
3324
+ "options": [
3325
+ "ENABLED",
3326
+ "PAUSED"
3327
+ ],
3328
+ "type": "option"
3329
+ },
3330
+ "supply-source": {
3331
+ "description": "Supply source, repeatable",
3332
+ "name": "supply-source",
3333
+ "default": [
3334
+ "APPSTORE_SEARCH_RESULTS"
3335
+ ],
3336
+ "hasDynamicHelp": false,
3337
+ "multiple": true,
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"
3385
+ }
3386
+ },
3387
+ "hasDynamicHelp": false,
3388
+ "hiddenAliases": [],
3389
+ "id": "asa:campaigns:get",
3390
+ "pluginAlias": "adapty",
3391
+ "pluginName": "adapty",
3392
+ "pluginType": "core",
3393
+ "strict": true,
3394
+ "enableJsonFlag": true,
3395
+ "isESM": true,
3396
+ "relativePath": [
3397
+ "dist",
3398
+ "commands",
3399
+ "asa",
3400
+ "campaigns",
3401
+ "get.js"
3402
+ ]
3403
+ },
3404
+ "asa:campaigns:list": {
3405
+ "aliases": [],
3406
+ "args": {},
3407
+ "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
3408
+ "examples": [
3409
+ "<%= config.bin %> asa campaigns list",
3410
+ "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
3411
+ ],
3412
+ "flags": {
3413
+ "json": {
3414
+ "description": "Format output as json.",
3415
+ "helpGroup": "GLOBAL",
3416
+ "name": "json",
3417
+ "allowNo": false,
3418
+ "type": "boolean"
3419
+ },
3420
+ "page": {
3421
+ "description": "Page number",
3422
+ "name": "page",
3423
+ "default": 1,
3424
+ "hasDynamicHelp": false,
3425
+ "multiple": false,
3426
+ "type": "option"
3427
+ },
3428
+ "page-size": {
3429
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3430
+ "name": "page-size",
3431
+ "default": 100,
3432
+ "hasDynamicHelp": false,
3433
+ "multiple": false,
3434
+ "type": "option"
3435
+ },
3436
+ "app": {
3437
+ "description": "Keep only rows in this app; repeatable",
3438
+ "name": "app",
3439
+ "hasDynamicHelp": false,
3440
+ "multiple": true,
3441
+ "type": "option"
3442
+ },
3443
+ "campaign-group": {
3444
+ "description": "Keep only rows in this campaign group; repeatable",
3445
+ "name": "campaign-group",
3446
+ "hasDynamicHelp": false,
3447
+ "multiple": true,
3448
+ "type": "option"
3449
+ },
3450
+ "search": {
3451
+ "description": "Case-insensitive substring match on the name",
3452
+ "name": "search",
3453
+ "hasDynamicHelp": false,
3454
+ "multiple": false,
3455
+ "type": "option"
3456
+ },
3457
+ "status": {
3458
+ "description": "Keep only rows in this state",
3459
+ "name": "status",
3460
+ "hasDynamicHelp": false,
3461
+ "multiple": false,
3462
+ "options": [
3463
+ "ENABLED",
3464
+ "PAUSED"
3465
+ ],
3466
+ "type": "option"
3467
+ }
3468
+ },
3469
+ "hasDynamicHelp": false,
3470
+ "hiddenAliases": [],
3471
+ "id": "asa:campaigns:list",
3472
+ "pluginAlias": "adapty",
3473
+ "pluginName": "adapty",
3474
+ "pluginType": "core",
3475
+ "strict": true,
3476
+ "enableJsonFlag": true,
3477
+ "isESM": true,
3478
+ "relativePath": [
3479
+ "dist",
3480
+ "commands",
3481
+ "asa",
3482
+ "campaigns",
3483
+ "list.js"
3484
+ ]
3485
+ },
3486
+ "asa:campaigns:update": {
3487
+ "aliases": [],
3488
+ "args": {
3489
+ "campaign_id": {
3490
+ "description": "Campaign ID (UUID)",
3491
+ "name": "campaign_id",
3492
+ "required": true
3493
+ }
3494
+ },
3495
+ "description": "Change a campaign: budgets, countries, status, schedule or Invoicing Options (all five --invoice-* flags together; they replace the stored set)",
3496
+ "examples": [
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"
3500
+ ],
3501
+ "flags": {
3502
+ "json": {
3503
+ "description": "Format output as json.",
3504
+ "helpGroup": "GLOBAL",
3505
+ "name": "json",
3506
+ "allowNo": false,
3507
+ "type": "boolean"
3508
+ },
3509
+ "currency": {
3510
+ "description": "Currency code for the amounts in this call",
3511
+ "name": "currency",
3512
+ "default": "USD",
3513
+ "hasDynamicHelp": false,
3514
+ "multiple": false,
3515
+ "type": "option"
3516
+ },
3517
+ "yes": {
3518
+ "char": "y",
3519
+ "description": "Apply without asking; required when the output is piped or --json is used",
3520
+ "name": "yes",
3521
+ "allowNo": false,
3522
+ "type": "boolean"
3523
+ },
3524
+ "idempotency-key": {
3525
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3526
+ "name": "idempotency-key",
3527
+ "hasDynamicHelp": false,
3528
+ "multiple": false,
3529
+ "type": "option"
3530
+ },
3531
+ "invoice-advertiser": {
3532
+ "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
3533
+ "name": "invoice-advertiser",
3534
+ "hasDynamicHelp": false,
3535
+ "multiple": false,
3536
+ "type": "option"
3537
+ },
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",
3569
+ "hasDynamicHelp": false,
3570
+ "multiple": false,
3571
+ "options": [
3572
+ "MANUAL_CPT",
3573
+ "MAX_CONVERSIONS"
3574
+ ],
3575
+ "type": "option"
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
+ },
3605
+ "status": {
3606
+ "description": "Campaign status",
3607
+ "name": "status",
3608
+ "hasDynamicHelp": false,
3609
+ "multiple": false,
3610
+ "options": [
3611
+ "ENABLED",
3612
+ "PAUSED"
3613
+ ],
3614
+ "type": "option"
3615
+ },
3616
+ "target-cpa": {
3617
+ "description": "Target CPA (amount, e.g. 50 or 12.50)",
3618
+ "name": "target-cpa",
3619
+ "hasDynamicHelp": false,
3620
+ "multiple": false,
3621
+ "type": "option"
3622
+ }
3623
+ },
3624
+ "hasDynamicHelp": false,
3625
+ "hiddenAliases": [],
3626
+ "id": "asa:campaigns:update",
3627
+ "pluginAlias": "adapty",
3628
+ "pluginName": "adapty",
3629
+ "pluginType": "core",
3630
+ "strict": true,
3631
+ "enableJsonFlag": true,
3632
+ "isESM": true,
3633
+ "relativePath": [
3284
3634
  "dist",
3285
3635
  "commands",
3286
3636
  "asa",
3287
- "keywords",
3637
+ "campaigns",
3288
3638
  "update.js"
3289
3639
  ]
3290
3640
  },
3641
+ "asa:competitors:summary": {
3642
+ "aliases": [],
3643
+ "args": {},
3644
+ "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
3645
+ "examples": [
3646
+ "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
3647
+ ],
3648
+ "flags": {
3649
+ "json": {
3650
+ "description": "Format output as json.",
3651
+ "helpGroup": "GLOBAL",
3652
+ "name": "json",
3653
+ "allowNo": false,
3654
+ "type": "boolean"
3655
+ },
3656
+ "app-ids": {
3657
+ "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
3658
+ "name": "app-ids",
3659
+ "required": true,
3660
+ "hasDynamicHelp": false,
3661
+ "multiple": false,
3662
+ "type": "option"
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",
3695
+ "allowNo": false,
3696
+ "type": "boolean"
3697
+ },
3698
+ "page": {
3699
+ "description": "Page number",
3700
+ "name": "page",
3701
+ "default": 1,
3702
+ "hasDynamicHelp": false,
3703
+ "multiple": false,
3704
+ "type": "option"
3705
+ },
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,
3710
+ "hasDynamicHelp": false,
3711
+ "multiple": false,
3712
+ "type": "option"
3713
+ },
3714
+ "app": {
3715
+ "description": "Keep only rows in this app; repeatable",
3716
+ "name": "app",
3717
+ "hasDynamicHelp": false,
3718
+ "multiple": true,
3719
+ "type": "option"
3720
+ },
3721
+ "campaign-group": {
3722
+ "description": "Keep only rows in this campaign group; repeatable",
3723
+ "name": "campaign-group",
3724
+ "hasDynamicHelp": false,
3725
+ "multiple": true,
3726
+ "type": "option"
3727
+ }
3728
+ },
3729
+ "hasDynamicHelp": false,
3730
+ "hiddenAliases": [],
3731
+ "id": "asa:creatives:list",
3732
+ "pluginAlias": "adapty",
3733
+ "pluginName": "adapty",
3734
+ "pluginType": "core",
3735
+ "strict": true,
3736
+ "enableJsonFlag": true,
3737
+ "isESM": true,
3738
+ "relativePath": [
3739
+ "dist",
3740
+ "commands",
3741
+ "asa",
3742
+ "creatives",
3743
+ "list.js"
3744
+ ]
3745
+ },
3291
3746
  "asa:metrics": {
3292
3747
  "aliases": [],
3293
3748
  "args": {},
3294
- "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.",
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.",
3295
3750
  "examples": [
3296
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
3297
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --order-by spend --page-size 5",
3298
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --group-by country --page-size 1000",
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",
3299
3754
  "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric roas",
3300
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric roas --by-days 7 --by-days 90"
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..."
3301
3757
  ],
3302
3758
  "flags": {
3303
3759
  "json": {
@@ -3330,6 +3786,27 @@
3330
3786
  "multiple": true,
3331
3787
  "type": "option"
3332
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
+ },
3796
+ "app": {
3797
+ "description": "Keep only rows in this app; repeatable",
3798
+ "name": "app",
3799
+ "hasDynamicHelp": false,
3800
+ "multiple": true,
3801
+ "type": "option"
3802
+ },
3803
+ "campaign": {
3804
+ "description": "Keep only rows in this campaign; repeatable",
3805
+ "name": "campaign",
3806
+ "hasDynamicHelp": false,
3807
+ "multiple": true,
3808
+ "type": "option"
3809
+ },
3333
3810
  "date-from": {
3334
3811
  "description": "Start of the period (YYYY-MM-DD)",
3335
3812
  "name": "date-from",
@@ -3376,8 +3853,9 @@
3376
3853
  "type": "option"
3377
3854
  },
3378
3855
  "metric": {
3379
- "description": "Metric name (dashboard nomenclature, e.g. spend, taps, gross_roas), repeatable; omit for every metric; a wrong name fails listing all valid ones",
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",
3380
3857
  "name": "metric",
3858
+ "required": true,
3381
3859
  "hasDynamicHelp": false,
3382
3860
  "multiple": true,
3383
3861
  "type": "option"
@@ -3486,25 +3964,74 @@
3486
3964
  "multiple": true,
3487
3965
  "type": "option"
3488
3966
  },
3489
- "period-unit": {
3490
- "description": "Bucket size",
3491
- "name": "period-unit",
3492
- "default": "day",
3967
+ "period-unit": {
3968
+ "description": "Bucket size",
3969
+ "name": "period-unit",
3970
+ "default": "day",
3971
+ "hasDynamicHelp": false,
3972
+ "multiple": false,
3973
+ "options": [
3974
+ "day",
3975
+ "month",
3976
+ "quarter",
3977
+ "week",
3978
+ "year"
3979
+ ],
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,
3493
4027
  "hasDynamicHelp": false,
3494
4028
  "multiple": false,
3495
- "options": [
3496
- "day",
3497
- "month",
3498
- "quarter",
3499
- "week",
3500
- "year"
3501
- ],
3502
4029
  "type": "option"
3503
4030
  }
3504
4031
  },
3505
4032
  "hasDynamicHelp": false,
3506
4033
  "hiddenAliases": [],
3507
- "id": "asa:metrics:overview",
4034
+ "id": "asa:orgs:list",
3508
4035
  "pluginAlias": "adapty",
3509
4036
  "pluginName": "adapty",
3510
4037
  "pluginType": "core",
@@ -3515,8 +4042,8 @@
3515
4042
  "dist",
3516
4043
  "commands",
3517
4044
  "asa",
3518
- "metrics",
3519
- "overview.js"
4045
+ "orgs",
4046
+ "list.js"
3520
4047
  ]
3521
4048
  },
3522
4049
  "asa:negative-keywords:add": {
@@ -3720,174 +4247,6 @@
3720
4247
  "list.js"
3721
4248
  ]
3722
4249
  },
3723
- "asa:orgs:list": {
3724
- "aliases": [],
3725
- "args": {},
3726
- "description": "List the Apple Search Ads organizations this company can spend from",
3727
- "examples": [
3728
- "<%= config.bin %> asa orgs list"
3729
- ],
3730
- "flags": {
3731
- "json": {
3732
- "description": "Format output as json.",
3733
- "helpGroup": "GLOBAL",
3734
- "name": "json",
3735
- "allowNo": false,
3736
- "type": "boolean"
3737
- },
3738
- "page": {
3739
- "description": "Page number",
3740
- "name": "page",
3741
- "default": 1,
3742
- "hasDynamicHelp": false,
3743
- "multiple": false,
3744
- "type": "option"
3745
- },
3746
- "page-size": {
3747
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3748
- "name": "page-size",
3749
- "default": 100,
3750
- "hasDynamicHelp": false,
3751
- "multiple": false,
3752
- "type": "option"
3753
- }
3754
- },
3755
- "hasDynamicHelp": false,
3756
- "hiddenAliases": [],
3757
- "id": "asa:orgs:list",
3758
- "pluginAlias": "adapty",
3759
- "pluginName": "adapty",
3760
- "pluginType": "core",
3761
- "strict": true,
3762
- "enableJsonFlag": true,
3763
- "isESM": true,
3764
- "relativePath": [
3765
- "dist",
3766
- "commands",
3767
- "asa",
3768
- "orgs",
3769
- "list.js"
3770
- ]
3771
- },
3772
- "asa:product-pages:list": {
3773
- "aliases": [],
3774
- "args": {},
3775
- "description": "List custom product pages (read-only; authoring stays in App Store Connect)",
3776
- "examples": [
3777
- "<%= config.bin %> asa product-pages list",
3778
- "<%= config.bin %> asa product-pages list --app APP_UUID"
3779
- ],
3780
- "flags": {
3781
- "json": {
3782
- "description": "Format output as json.",
3783
- "helpGroup": "GLOBAL",
3784
- "name": "json",
3785
- "allowNo": false,
3786
- "type": "boolean"
3787
- },
3788
- "page": {
3789
- "description": "Page number",
3790
- "name": "page",
3791
- "default": 1,
3792
- "hasDynamicHelp": false,
3793
- "multiple": false,
3794
- "type": "option"
3795
- },
3796
- "page-size": {
3797
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3798
- "name": "page-size",
3799
- "default": 100,
3800
- "hasDynamicHelp": false,
3801
- "multiple": false,
3802
- "type": "option"
3803
- },
3804
- "app": {
3805
- "description": "Keep only rows in this app; repeatable",
3806
- "name": "app",
3807
- "hasDynamicHelp": false,
3808
- "multiple": true,
3809
- "type": "option"
3810
- },
3811
- "campaign-group": {
3812
- "description": "Keep only rows in this campaign group; repeatable",
3813
- "name": "campaign-group",
3814
- "hasDynamicHelp": false,
3815
- "multiple": true,
3816
- "type": "option"
3817
- }
3818
- },
3819
- "hasDynamicHelp": false,
3820
- "hiddenAliases": [],
3821
- "id": "asa:product-pages:list",
3822
- "pluginAlias": "adapty",
3823
- "pluginName": "adapty",
3824
- "pluginType": "core",
3825
- "strict": true,
3826
- "enableJsonFlag": true,
3827
- "isESM": true,
3828
- "relativePath": [
3829
- "dist",
3830
- "commands",
3831
- "asa",
3832
- "product-pages",
3833
- "list.js"
3834
- ]
3835
- },
3836
- "asa:product-pages:sync": {
3837
- "aliases": [],
3838
- "args": {},
3839
- "description": "Refresh custom product pages from Apple",
3840
- "examples": [
3841
- "<%= config.bin %> asa product-pages sync",
3842
- "<%= config.bin %> asa product-pages sync --adam-id 123456"
3843
- ],
3844
- "flags": {
3845
- "json": {
3846
- "description": "Format output as json.",
3847
- "helpGroup": "GLOBAL",
3848
- "name": "json",
3849
- "allowNo": false,
3850
- "type": "boolean"
3851
- },
3852
- "yes": {
3853
- "char": "y",
3854
- "description": "Apply without asking; required when the output is piped or --json is used",
3855
- "name": "yes",
3856
- "allowNo": false,
3857
- "type": "boolean"
3858
- },
3859
- "idempotency-key": {
3860
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3861
- "name": "idempotency-key",
3862
- "hasDynamicHelp": false,
3863
- "multiple": false,
3864
- "type": "option"
3865
- },
3866
- "adam-id": {
3867
- "description": "Limit the refresh to one app; omit to cover every app",
3868
- "name": "adam-id",
3869
- "hasDynamicHelp": false,
3870
- "multiple": false,
3871
- "type": "option"
3872
- }
3873
- },
3874
- "hasDynamicHelp": false,
3875
- "hiddenAliases": [],
3876
- "id": "asa:product-pages:sync",
3877
- "pluginAlias": "adapty",
3878
- "pluginName": "adapty",
3879
- "pluginType": "core",
3880
- "strict": true,
3881
- "enableJsonFlag": true,
3882
- "isESM": true,
3883
- "relativePath": [
3884
- "dist",
3885
- "commands",
3886
- "asa",
3887
- "product-pages",
3888
- "sync.js"
3889
- ]
3890
- },
3891
4250
  "asa:search-terms:list": {
3892
4251
  "aliases": [],
3893
4252
  "args": {},
@@ -3946,80 +4305,33 @@
3946
4305
  "name": "campaign-group",
3947
4306
  "hasDynamicHelp": false,
3948
4307
  "multiple": true,
3949
- "type": "option"
3950
- },
3951
- "search": {
3952
- "description": "Case-insensitive substring match on the name",
3953
- "name": "search",
3954
- "hasDynamicHelp": false,
3955
- "multiple": false,
3956
- "type": "option"
3957
- },
3958
- "campaign": {
3959
- "description": "Keep only rows in this campaign; repeatable",
3960
- "name": "campaign",
3961
- "hasDynamicHelp": false,
3962
- "multiple": true,
3963
- "type": "option"
3964
- },
3965
- "ad-group": {
3966
- "description": "Keep only rows in this ad group; repeatable",
3967
- "name": "ad-group",
3968
- "hasDynamicHelp": false,
3969
- "multiple": true,
3970
- "type": "option"
3971
- }
3972
- },
3973
- "hasDynamicHelp": false,
3974
- "hiddenAliases": [],
3975
- "id": "asa:search-terms:list",
3976
- "pluginAlias": "adapty",
3977
- "pluginName": "adapty",
3978
- "pluginType": "core",
3979
- "strict": true,
3980
- "enableJsonFlag": true,
3981
- "isESM": true,
3982
- "relativePath": [
3983
- "dist",
3984
- "commands",
3985
- "asa",
3986
- "search-terms",
3987
- "list.js"
3988
- ]
3989
- },
3990
- "flows:config:get": {
3991
- "aliases": [],
3992
- "args": {
3993
- "flow_id": {
3994
- "description": "Flow ID (UUID)",
3995
- "name": "flow_id",
3996
- "required": true
3997
- }
3998
- },
3999
- "description": "Read the flow builder config (404 until the config has been written at least once)",
4000
- "examples": [
4001
- "<%= config.bin %> flows config get --app UUID 550e8400-e29b-41d4-a716-446655440000"
4002
- ],
4003
- "flags": {
4004
- "json": {
4005
- "description": "Format output as json.",
4006
- "helpGroup": "GLOBAL",
4007
- "name": "json",
4008
- "allowNo": false,
4009
- "type": "boolean"
4010
- },
4011
- "app": {
4012
- "description": "App ID (UUID)",
4013
- "name": "app",
4014
- "required": true,
4308
+ "type": "option"
4309
+ },
4310
+ "search": {
4311
+ "description": "Case-insensitive substring match on the name",
4312
+ "name": "search",
4015
4313
  "hasDynamicHelp": false,
4016
4314
  "multiple": false,
4017
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"
4018
4330
  }
4019
4331
  },
4020
4332
  "hasDynamicHelp": false,
4021
4333
  "hiddenAliases": [],
4022
- "id": "flows:config:get",
4334
+ "id": "asa:search-terms:list",
4023
4335
  "pluginAlias": "adapty",
4024
4336
  "pluginName": "adapty",
4025
4337
  "pluginType": "core",
@@ -4029,26 +4341,18 @@
4029
4341
  "relativePath": [
4030
4342
  "dist",
4031
4343
  "commands",
4032
- "flows",
4033
- "config",
4034
- "get.js"
4344
+ "asa",
4345
+ "search-terms",
4346
+ "list.js"
4035
4347
  ]
4036
4348
  },
4037
- "flows:config:preview": {
4349
+ "asa:product-pages:list": {
4038
4350
  "aliases": [],
4039
- "args": {
4040
- "config_file": {
4041
- "description": "Path to a local flow config JSON file",
4042
- "name": "config_file",
4043
- "required": true
4044
- }
4045
- },
4046
- "description": "Build a render URL for a local flow config and open it. A quick-look escape hatch for small configs: the whole config rides in the URL fragment, and past roughly 32KB of pretty-printed JSON the render page gets slow and unreliable. Opens the browser on a TTY; when piped or with --json, prints the URL alone — and that URL is long (~113K characters for a 668KB flow), so pipe it into whatever takes the screenshot (\"| node capture.mjs\") or pass it with --url and command substitution. Never print or read it: agents burn context for zero information. The render host comes from $ADAPTY_APP_URL.",
4351
+ "args": {},
4352
+ "description": "List custom product pages (read-only; authoring stays in App Store Connect)",
4047
4353
  "examples": [
4048
- "<%= config.bin %> flows config preview ./config.json",
4049
- "<%= config.bin %> flows config preview ./config.json --screen welcome --device ipad-pro --orientation landscape",
4050
- "# pipe the URL straight into a screenshot tool, never print it\n<%= config.bin %> flows config preview ./config.json | node capture.mjs --out shot.png",
4051
- "# or pass it as an argument, for tools that want a flag\nnode capture.mjs --url \"$(<%= config.bin %> flows config preview ./config.json)\" --out shot.png"
4354
+ "<%= config.bin %> asa product-pages list",
4355
+ "<%= config.bin %> asa product-pages list --app APP_UUID"
4052
4356
  ],
4053
4357
  "flags": {
4054
4358
  "json": {
@@ -4058,37 +4362,40 @@
4058
4362
  "allowNo": false,
4059
4363
  "type": "boolean"
4060
4364
  },
4061
- "device": {
4062
- "description": "Device frame to render in",
4063
- "name": "device",
4064
- "default": "iphone-14",
4365
+ "page": {
4366
+ "description": "Page number",
4367
+ "name": "page",
4368
+ "default": 1,
4065
4369
  "hasDynamicHelp": false,
4066
4370
  "multiple": false,
4067
4371
  "type": "option"
4068
4372
  },
4069
- "orientation": {
4070
- "description": "Device orientation to render in",
4071
- "name": "orientation",
4072
- "default": "portrait",
4373
+ "page-size": {
4374
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4375
+ "name": "page-size",
4376
+ "default": 100,
4073
4377
  "hasDynamicHelp": false,
4074
4378
  "multiple": false,
4075
- "options": [
4076
- "landscape",
4077
- "portrait"
4078
- ],
4079
4379
  "type": "option"
4080
4380
  },
4081
- "screen": {
4082
- "description": "Screen ID to render (default: the flow's first screen)",
4083
- "name": "screen",
4381
+ "app": {
4382
+ "description": "Keep only rows in this app; repeatable",
4383
+ "name": "app",
4084
4384
  "hasDynamicHelp": false,
4085
- "multiple": false,
4385
+ "multiple": true,
4386
+ "type": "option"
4387
+ },
4388
+ "campaign-group": {
4389
+ "description": "Keep only rows in this campaign group; repeatable",
4390
+ "name": "campaign-group",
4391
+ "hasDynamicHelp": false,
4392
+ "multiple": true,
4086
4393
  "type": "option"
4087
4394
  }
4088
4395
  },
4089
4396
  "hasDynamicHelp": false,
4090
4397
  "hiddenAliases": [],
4091
- "id": "flows:config:preview",
4398
+ "id": "asa:product-pages:list",
4092
4399
  "pluginAlias": "adapty",
4093
4400
  "pluginName": "adapty",
4094
4401
  "pluginType": "core",
@@ -4098,25 +4405,18 @@
4098
4405
  "relativePath": [
4099
4406
  "dist",
4100
4407
  "commands",
4101
- "flows",
4102
- "config",
4103
- "preview.js"
4408
+ "asa",
4409
+ "product-pages",
4410
+ "list.js"
4104
4411
  ]
4105
4412
  },
4106
- "flows:config:update": {
4413
+ "asa:product-pages:sync": {
4107
4414
  "aliases": [],
4108
- "args": {
4109
- "flow_id": {
4110
- "description": "Flow ID (UUID)",
4111
- "name": "flow_id",
4112
- "required": true
4113
- }
4114
- },
4115
- "description": "Write the flow builder config (creates the first version, or edits/forks the current one)",
4415
+ "args": {},
4416
+ "description": "Refresh custom product pages from Apple",
4116
4417
  "examples": [
4117
- "<%= config.bin %> flows config update --app UUID FLOW_UUID --config-file config.json",
4118
- "cat config.json | <%= config.bin %> flows config update --app UUID FLOW_UUID --config-file -",
4119
- "<%= config.bin %> flows config update --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}' --expected-updated-at 1755001800000"
4418
+ "<%= config.bin %> asa product-pages sync",
4419
+ "<%= config.bin %> asa product-pages sync --adam-id 123456"
4120
4420
  ],
4121
4421
  "flags": {
4122
4422
  "json": {
@@ -4126,38 +4426,23 @@
4126
4426
  "allowNo": false,
4127
4427
  "type": "boolean"
4128
4428
  },
4129
- "app": {
4130
- "description": "App ID (UUID)",
4131
- "name": "app",
4132
- "required": true,
4133
- "hasDynamicHelp": false,
4134
- "multiple": false,
4135
- "type": "option"
4136
- },
4137
- "config": {
4138
- "description": "Builder config as a JSON string",
4139
- "name": "config",
4140
- "hasDynamicHelp": false,
4141
- "multiple": false,
4142
- "type": "option"
4143
- },
4144
- "config-file": {
4145
- "description": "JSON file with the builder config, or - to read stdin",
4146
- "name": "config-file",
4147
- "hasDynamicHelp": false,
4148
- "multiple": false,
4149
- "type": "option"
4429
+ "yes": {
4430
+ "char": "y",
4431
+ "description": "Apply without asking; required when the output is piped or --json is used",
4432
+ "name": "yes",
4433
+ "allowNo": false,
4434
+ "type": "boolean"
4150
4435
  },
4151
- "expected-updated-at": {
4152
- "description": "Optimistic lock: the `updated_at` from a prior config read. Omit for last-write-wins.",
4153
- "name": "expected-updated-at",
4436
+ "idempotency-key": {
4437
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4438
+ "name": "idempotency-key",
4154
4439
  "hasDynamicHelp": false,
4155
4440
  "multiple": false,
4156
4441
  "type": "option"
4157
4442
  },
4158
- "remote-configs": {
4159
- "description": "JSON array of remote config entries: [{locale, data}]",
4160
- "name": "remote-configs",
4443
+ "adam-id": {
4444
+ "description": "Limit the refresh to one app; omit to cover every app",
4445
+ "name": "adam-id",
4161
4446
  "hasDynamicHelp": false,
4162
4447
  "multiple": false,
4163
4448
  "type": "option"
@@ -4165,7 +4450,7 @@
4165
4450
  },
4166
4451
  "hasDynamicHelp": false,
4167
4452
  "hiddenAliases": [],
4168
- "id": "flows:config:update",
4453
+ "id": "asa:product-pages:sync",
4169
4454
  "pluginAlias": "adapty",
4170
4455
  "pluginName": "adapty",
4171
4456
  "pluginType": "core",
@@ -4175,25 +4460,23 @@
4175
4460
  "relativePath": [
4176
4461
  "dist",
4177
4462
  "commands",
4178
- "flows",
4179
- "config",
4180
- "update.js"
4463
+ "asa",
4464
+ "product-pages",
4465
+ "sync.js"
4181
4466
  ]
4182
4467
  },
4183
- "flows:config:validate": {
4468
+ "flows:media:upload": {
4184
4469
  "aliases": [],
4185
4470
  "args": {
4186
- "flow_id": {
4187
- "description": "Flow ID (UUID)",
4188
- "name": "flow_id",
4471
+ "file": {
4472
+ "description": "Path to the image file to upload",
4473
+ "name": "file",
4189
4474
  "required": true
4190
4475
  }
4191
4476
  },
4192
- "description": "Check whether a builder config is publishable (advisory; does not save). Exits non-zero when the config is not publishable.",
4477
+ "description": "Upload an image as a flow builder asset; prints the CDN URL to reference from a flow config",
4193
4478
  "examples": [
4194
- "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file config.json",
4195
- "cat config.json | <%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file -",
4196
- "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}'"
4479
+ "<%= config.bin %> flows media upload --app UUID ./onboarding-hero.png"
4197
4480
  ],
4198
4481
  "flags": {
4199
4482
  "json": {
@@ -4210,25 +4493,11 @@
4210
4493
  "hasDynamicHelp": false,
4211
4494
  "multiple": false,
4212
4495
  "type": "option"
4213
- },
4214
- "config": {
4215
- "description": "Builder config as a JSON string",
4216
- "name": "config",
4217
- "hasDynamicHelp": false,
4218
- "multiple": false,
4219
- "type": "option"
4220
- },
4221
- "config-file": {
4222
- "description": "JSON file with the builder config, or - to read stdin",
4223
- "name": "config-file",
4224
- "hasDynamicHelp": false,
4225
- "multiple": false,
4226
- "type": "option"
4227
4496
  }
4228
4497
  },
4229
4498
  "hasDynamicHelp": false,
4230
4499
  "hiddenAliases": [],
4231
- "id": "flows:config:validate",
4500
+ "id": "flows:media:upload",
4232
4501
  "pluginAlias": "adapty",
4233
4502
  "pluginName": "adapty",
4234
4503
  "pluginType": "core",
@@ -4239,22 +4508,22 @@
4239
4508
  "dist",
4240
4509
  "commands",
4241
4510
  "flows",
4242
- "config",
4243
- "validate.js"
4511
+ "media",
4512
+ "upload.js"
4244
4513
  ]
4245
4514
  },
4246
- "flows:media:upload": {
4515
+ "flows:config:get": {
4247
4516
  "aliases": [],
4248
4517
  "args": {
4249
- "file": {
4250
- "description": "Path to the image file to upload",
4251
- "name": "file",
4518
+ "flow_id": {
4519
+ "description": "Flow ID (UUID)",
4520
+ "name": "flow_id",
4252
4521
  "required": true
4253
4522
  }
4254
4523
  },
4255
- "description": "Upload an image as a flow builder asset; prints the CDN URL to reference from a flow config",
4524
+ "description": "Read the flow builder config (404 until the config has been written at least once)",
4256
4525
  "examples": [
4257
- "<%= config.bin %> flows media upload --app UUID ./onboarding-hero.png"
4526
+ "<%= config.bin %> flows config get --app UUID 550e8400-e29b-41d4-a716-446655440000"
4258
4527
  ],
4259
4528
  "flags": {
4260
4529
  "json": {
@@ -4275,7 +4544,7 @@
4275
4544
  },
4276
4545
  "hasDynamicHelp": false,
4277
4546
  "hiddenAliases": [],
4278
- "id": "flows:media:upload",
4547
+ "id": "flows:config:get",
4279
4548
  "pluginAlias": "adapty",
4280
4549
  "pluginName": "adapty",
4281
4550
  "pluginType": "core",
@@ -4286,19 +4555,25 @@
4286
4555
  "dist",
4287
4556
  "commands",
4288
4557
  "flows",
4289
- "media",
4290
- "upload.js"
4558
+ "config",
4559
+ "get.js"
4291
4560
  ]
4292
4561
  },
4293
- "asa:campaigns:bulk-create": {
4562
+ "flows:config:preview": {
4294
4563
  "aliases": [],
4295
- "args": {},
4296
- "description": "Create a whole campaign structure (campaigns → ad groups → keywords/negative keywords/ads) in one bulk operation",
4564
+ "args": {
4565
+ "config_file": {
4566
+ "description": "Path to a local flow config JSON file",
4567
+ "name": "config_file",
4568
+ "required": true
4569
+ }
4570
+ },
4571
+ "description": "Build a render URL for a local flow config and open it. A quick-look escape hatch for small configs: the whole config rides in the URL fragment, and past roughly 32KB of pretty-printed JSON the render page gets slow and unreliable. Opens the browser on a TTY; when piped or with --json, prints the URL alone — and that URL is long (~113K characters for a 668KB flow), so pipe it into whatever takes the screenshot (\"| node capture.mjs\") or pass it with --url and command substitution. Never print or read it: agents burn context for zero information. The render host comes from $ADAPTY_APP_URL.",
4297
4572
  "examples": [
4298
- "<%= config.bin %> asa campaigns bulk-create --file structure.json",
4299
- "cat structure.json | <%= config.bin %> asa campaigns bulk-create --file -",
4300
- "<%= config.bin %> asa campaigns bulk-create --from-file Campaign_And_Adgroup_Template.xlsx --org-id 1234567",
4301
- "<%= config.bin %> asa campaigns bulk-create --from-file keywords_template.csv --org-id 1234567 --preview"
4573
+ "<%= config.bin %> flows config preview ./config.json",
4574
+ "<%= config.bin %> flows config preview ./config.json --screen welcome --device ipad-pro --orientation landscape",
4575
+ "# pipe the URL straight into a screenshot tool, never print it\n<%= config.bin %> flows config preview ./config.json | node capture.mjs --out shot.png",
4576
+ "# or pass it as an argument, for tools that want a flag\nnode capture.mjs --url \"$(<%= config.bin %> flows config preview ./config.json)\" --out shot.png"
4302
4577
  ],
4303
4578
  "flags": {
4304
4579
  "json": {
@@ -4308,73 +4583,37 @@
4308
4583
  "allowNo": false,
4309
4584
  "type": "boolean"
4310
4585
  },
4311
- "yes": {
4312
- "char": "y",
4313
- "description": "Apply without asking; required when the output is piped or --json is used",
4314
- "name": "yes",
4315
- "allowNo": false,
4316
- "type": "boolean"
4317
- },
4318
- "idempotency-key": {
4319
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4320
- "name": "idempotency-key",
4321
- "hasDynamicHelp": false,
4322
- "multiple": false,
4323
- "type": "option"
4324
- },
4325
- "file": {
4326
- "description": "JSON file with the campaign structure (the POST /bulk-operations/ body); use \"-\" for stdin",
4327
- "name": "file",
4328
- "hasDynamicHelp": false,
4329
- "multiple": false,
4330
- "type": "option"
4331
- },
4332
- "from-file": {
4333
- "description": "Apple Ads bulk template (Campaign_And_Adgroup_Template.xlsx or keywords .csv) to convert and submit",
4334
- "name": "from-file",
4335
- "hasDynamicHelp": false,
4336
- "multiple": false,
4337
- "type": "option"
4338
- },
4339
- "org-id": {
4340
- "description": "Apple org id (campaign_group_id) the converted template will target; required with --from-file",
4341
- "name": "org-id",
4586
+ "device": {
4587
+ "description": "Device frame to render in",
4588
+ "name": "device",
4589
+ "default": "iphone-14",
4342
4590
  "hasDynamicHelp": false,
4343
4591
  "multiple": false,
4344
4592
  "type": "option"
4345
4593
  },
4346
- "poll-interval": {
4347
- "description": "Seconds between progress polls",
4348
- "name": "poll-interval",
4349
- "default": 5,
4594
+ "orientation": {
4595
+ "description": "Device orientation to render in",
4596
+ "name": "orientation",
4597
+ "default": "portrait",
4350
4598
  "hasDynamicHelp": false,
4351
4599
  "multiple": false,
4600
+ "options": [
4601
+ "landscape",
4602
+ "portrait"
4603
+ ],
4352
4604
  "type": "option"
4353
4605
  },
4354
- "preview": {
4355
- "description": "With --from-file: print the converted request and stop, nothing is created",
4356
- "name": "preview",
4357
- "allowNo": false,
4358
- "type": "boolean"
4359
- },
4360
- "timeout": {
4361
- "description": "Max seconds to wait for the operation to finish",
4362
- "name": "timeout",
4363
- "default": 900,
4606
+ "screen": {
4607
+ "description": "Screen ID to render (default: the flow's first screen)",
4608
+ "name": "screen",
4364
4609
  "hasDynamicHelp": false,
4365
4610
  "multiple": false,
4366
4611
  "type": "option"
4367
- },
4368
- "wait": {
4369
- "description": "Poll the operation until it finishes; --no-wait returns the operation id immediately",
4370
- "name": "wait",
4371
- "allowNo": true,
4372
- "type": "boolean"
4373
4612
  }
4374
4613
  },
4375
4614
  "hasDynamicHelp": false,
4376
4615
  "hiddenAliases": [],
4377
- "id": "asa:campaigns:bulk-create",
4616
+ "id": "flows:config:preview",
4378
4617
  "pluginAlias": "adapty",
4379
4618
  "pluginName": "adapty",
4380
4619
  "pluginType": "core",
@@ -4384,19 +4623,25 @@
4384
4623
  "relativePath": [
4385
4624
  "dist",
4386
4625
  "commands",
4387
- "asa",
4388
- "campaigns",
4389
- "bulk-create.js"
4626
+ "flows",
4627
+ "config",
4628
+ "preview.js"
4390
4629
  ]
4391
4630
  },
4392
- "asa:campaigns:bulk-list": {
4631
+ "flows:config:update": {
4393
4632
  "aliases": [],
4394
- "args": {},
4395
- "description": "This company's bulk operations, newest first; inspect one with bulk-status",
4633
+ "args": {
4634
+ "flow_id": {
4635
+ "description": "Flow ID (UUID)",
4636
+ "name": "flow_id",
4637
+ "required": true
4638
+ }
4639
+ },
4640
+ "description": "Write the flow builder config (creates the first version, or edits/forks the current one)",
4396
4641
  "examples": [
4397
- "<%= config.bin %> asa campaigns bulk-list",
4398
- "<%= config.bin %> asa campaigns bulk-list --status partial --status failed",
4399
- "<%= config.bin %> asa campaigns bulk-list --created-from 2026-08-01 --created-to 2026-08-20"
4642
+ "<%= config.bin %> flows config update --app UUID FLOW_UUID --config-file config.json",
4643
+ "cat config.json | <%= config.bin %> flows config update --app UUID FLOW_UUID --config-file -",
4644
+ "<%= config.bin %> flows config update --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}' --expected-updated-at 1755001800000"
4400
4645
  ],
4401
4646
  "flags": {
4402
4647
  "json": {
@@ -4406,61 +4651,46 @@
4406
4651
  "allowNo": false,
4407
4652
  "type": "boolean"
4408
4653
  },
4409
- "page": {
4410
- "description": "Page number",
4411
- "name": "page",
4412
- "default": 1,
4654
+ "app": {
4655
+ "description": "App ID (UUID)",
4656
+ "name": "app",
4657
+ "required": true,
4413
4658
  "hasDynamicHelp": false,
4414
4659
  "multiple": false,
4415
4660
  "type": "option"
4416
4661
  },
4417
- "page-size": {
4418
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4419
- "name": "page-size",
4420
- "default": 100,
4662
+ "config": {
4663
+ "description": "Builder config as a JSON string",
4664
+ "name": "config",
4421
4665
  "hasDynamicHelp": false,
4422
4666
  "multiple": false,
4423
4667
  "type": "option"
4424
4668
  },
4425
- "app": {
4426
- "description": "Keep only operations of this app (UUID)",
4427
- "name": "app",
4669
+ "config-file": {
4670
+ "description": "JSON file with the builder config, or - to read stdin",
4671
+ "name": "config-file",
4428
4672
  "hasDynamicHelp": false,
4429
4673
  "multiple": false,
4430
4674
  "type": "option"
4431
4675
  },
4432
- "created-from": {
4433
- "description": "Keep only operations created on or after this date (YYYY-MM-DD)",
4434
- "name": "created-from",
4676
+ "expected-updated-at": {
4677
+ "description": "Optimistic lock: the `updated_at` from a prior config read. Omit for last-write-wins.",
4678
+ "name": "expected-updated-at",
4435
4679
  "hasDynamicHelp": false,
4436
4680
  "multiple": false,
4437
4681
  "type": "option"
4438
4682
  },
4439
- "created-to": {
4440
- "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
4441
- "name": "created-to",
4683
+ "remote-configs": {
4684
+ "description": "JSON array of remote config entries: [{locale, data}]",
4685
+ "name": "remote-configs",
4442
4686
  "hasDynamicHelp": false,
4443
4687
  "multiple": false,
4444
4688
  "type": "option"
4445
- },
4446
- "status": {
4447
- "description": "Keep only operations in this state; repeatable",
4448
- "name": "status",
4449
- "hasDynamicHelp": false,
4450
- "multiple": true,
4451
- "options": [
4452
- "failed",
4453
- "partial",
4454
- "pending",
4455
- "running",
4456
- "success"
4457
- ],
4458
- "type": "option"
4459
4689
  }
4460
4690
  },
4461
4691
  "hasDynamicHelp": false,
4462
4692
  "hiddenAliases": [],
4463
- "id": "asa:campaigns:bulk-list",
4693
+ "id": "flows:config:update",
4464
4694
  "pluginAlias": "adapty",
4465
4695
  "pluginName": "adapty",
4466
4696
  "pluginType": "core",
@@ -4470,23 +4700,25 @@
4470
4700
  "relativePath": [
4471
4701
  "dist",
4472
4702
  "commands",
4473
- "asa",
4474
- "campaigns",
4475
- "bulk-list.js"
4703
+ "flows",
4704
+ "config",
4705
+ "update.js"
4476
4706
  ]
4477
4707
  },
4478
- "asa:campaigns:bulk-status": {
4708
+ "flows:config:validate": {
4479
4709
  "aliases": [],
4480
4710
  "args": {
4481
- "operation-id": {
4482
- "description": "Bulk operation ID returned by bulk-create",
4483
- "name": "operation-id",
4711
+ "flow_id": {
4712
+ "description": "Flow ID (UUID)",
4713
+ "name": "flow_id",
4484
4714
  "required": true
4485
4715
  }
4486
4716
  },
4487
- "description": "Progress board of one bulk operation: counts, pipelines and the per-object log",
4717
+ "description": "Check whether a builder config is publishable (advisory; does not save). Exits non-zero when the config is not publishable.",
4488
4718
  "examples": [
4489
- "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
4719
+ "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file config.json",
4720
+ "cat config.json | <%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file -",
4721
+ "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}'"
4490
4722
  ],
4491
4723
  "flags": {
4492
4724
  "json": {
@@ -4496,18 +4728,24 @@
4496
4728
  "allowNo": false,
4497
4729
  "type": "boolean"
4498
4730
  },
4499
- "page": {
4500
- "description": "Page number",
4501
- "name": "page",
4502
- "default": 1,
4731
+ "app": {
4732
+ "description": "App ID (UUID)",
4733
+ "name": "app",
4734
+ "required": true,
4503
4735
  "hasDynamicHelp": false,
4504
4736
  "multiple": false,
4505
4737
  "type": "option"
4506
4738
  },
4507
- "page-size": {
4508
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4509
- "name": "page-size",
4510
- "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",
4511
4749
  "hasDynamicHelp": false,
4512
4750
  "multiple": false,
4513
4751
  "type": "option"
@@ -4515,7 +4753,7 @@
4515
4753
  },
4516
4754
  "hasDynamicHelp": false,
4517
4755
  "hiddenAliases": [],
4518
- "id": "asa:campaigns:bulk-status",
4756
+ "id": "flows:config:validate",
4519
4757
  "pluginAlias": "adapty",
4520
4758
  "pluginName": "adapty",
4521
4759
  "pluginType": "core",
@@ -4525,19 +4763,18 @@
4525
4763
  "relativePath": [
4526
4764
  "dist",
4527
4765
  "commands",
4528
- "asa",
4529
- "campaigns",
4530
- "bulk-status.js"
4766
+ "flows",
4767
+ "config",
4768
+ "validate.js"
4531
4769
  ]
4532
4770
  },
4533
- "asa:campaigns:create": {
4771
+ "asa:keywords:add": {
4534
4772
  "aliases": [],
4535
4773
  "args": {},
4536
- "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",
4774
+ "description": "Add targeting keywords to an ad group",
4537
4775
  "examples": [
4538
- "<%= config.bin %> asa campaigns create --org UUID --name \"Winter push\" --adam-id 123456 --country US --daily-budget 50",
4539
- "<%= config.bin %> asa campaigns create --org UUID --name \"Max Conv\" --adam-id 123456 --country US --daily-budget 50 --bidding-strategy MAX_CONVERSIONS",
4540
- "<%= 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"
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"
4541
4778
  ],
4542
4779
  "flags": {
4543
4780
  "json": {
@@ -4547,216 +4784,85 @@
4547
4784
  "allowNo": false,
4548
4785
  "type": "boolean"
4549
4786
  },
4550
- "currency": {
4551
- "description": "Currency code for the amounts in this call",
4552
- "name": "currency",
4553
- "default": "USD",
4554
- "hasDynamicHelp": false,
4555
- "multiple": false,
4556
- "type": "option"
4557
- },
4558
- "yes": {
4559
- "char": "y",
4560
- "description": "Apply without asking; required when the output is piped or --json is used",
4561
- "name": "yes",
4562
- "allowNo": false,
4563
- "type": "boolean"
4564
- },
4565
- "idempotency-key": {
4566
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4567
- "name": "idempotency-key",
4568
- "hasDynamicHelp": false,
4569
- "multiple": false,
4570
- "type": "option"
4571
- },
4572
- "invoice-advertiser": {
4573
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
4574
- "name": "invoice-advertiser",
4575
- "hasDynamicHelp": false,
4576
- "multiple": false,
4577
- "type": "option"
4578
- },
4579
- "invoice-billing-email": {
4580
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): billing contact email",
4581
- "name": "invoice-billing-email",
4582
- "hasDynamicHelp": false,
4583
- "multiple": false,
4584
- "type": "option"
4585
- },
4586
- "invoice-contact-email": {
4587
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact email",
4588
- "name": "invoice-contact-email",
4589
- "hasDynamicHelp": false,
4590
- "multiple": false,
4591
- "type": "option"
4592
- },
4593
- "invoice-contact-name": {
4594
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact name",
4595
- "name": "invoice-contact-name",
4596
- "hasDynamicHelp": false,
4597
- "multiple": false,
4598
- "type": "option"
4599
- },
4600
- "invoice-order-number": {
4601
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): order number",
4602
- "name": "invoice-order-number",
4603
- "hasDynamicHelp": false,
4604
- "multiple": false,
4605
- "type": "option"
4606
- },
4607
- "ad-channel-type": {
4608
- "description": "Ad channel type",
4609
- "name": "ad-channel-type",
4610
- "default": "SEARCH",
4611
- "hasDynamicHelp": false,
4612
- "multiple": false,
4613
- "options": [
4614
- "DISPLAY",
4615
- "SEARCH"
4616
- ],
4617
- "type": "option"
4618
- },
4619
- "adam-id": {
4620
- "description": "App Store app ID (adam_id)",
4621
- "name": "adam-id",
4622
- "required": true,
4623
- "hasDynamicHelp": false,
4624
- "multiple": false,
4625
- "type": "option"
4626
- },
4627
- "bidding-strategy": {
4628
- "description": "Bidding strategy; Apple defaults to MANUAL_CPT when omitted",
4629
- "name": "bidding-strategy",
4630
- "hasDynamicHelp": false,
4631
- "multiple": false,
4632
- "options": [
4633
- "MANUAL_CPT",
4634
- "MAX_CONVERSIONS"
4635
- ],
4636
- "type": "option"
4637
- },
4638
- "billing-event": {
4639
- "description": "Billing event",
4640
- "name": "billing-event",
4641
- "default": "TAPS",
4787
+ "currency": {
4788
+ "description": "Currency code for the amounts in this call",
4789
+ "name": "currency",
4790
+ "default": "USD",
4642
4791
  "hasDynamicHelp": false,
4643
4792
  "multiple": false,
4644
- "options": [
4645
- "IMPRESSIONS",
4646
- "TAPS"
4647
- ],
4648
4793
  "type": "option"
4649
4794
  },
4650
- "budget": {
4651
- "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
4652
- "name": "budget",
4795
+ "yes": {
4796
+ "char": "y",
4797
+ "description": "Apply without asking; required when the output is piped or --json is used",
4798
+ "name": "yes",
4799
+ "allowNo": false,
4800
+ "type": "boolean"
4801
+ },
4802
+ "idempotency-key": {
4803
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4804
+ "name": "idempotency-key",
4653
4805
  "hasDynamicHelp": false,
4654
4806
  "multiple": false,
4655
4807
  "type": "option"
4656
4808
  },
4657
- "country": {
4658
- "description": "Country or region code, repeatable",
4659
- "name": "country",
4809
+ "ad-group": {
4810
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
4811
+ "name": "ad-group",
4660
4812
  "required": true,
4661
4813
  "hasDynamicHelp": false,
4662
- "multiple": true,
4814
+ "multiple": false,
4663
4815
  "type": "option"
4664
4816
  },
4665
- "daily-budget": {
4666
- "description": "Daily budget (amount, e.g. 50 or 12.50)",
4667
- "name": "daily-budget",
4668
- "required": true,
4817
+ "bid": {
4818
+ "description": "Bid per keyword (amount, e.g. 50 or 12.50)",
4819
+ "name": "bid",
4669
4820
  "hasDynamicHelp": false,
4670
4821
  "multiple": false,
4671
4822
  "type": "option"
4672
4823
  },
4673
- "name": {
4674
- "description": "Campaign name",
4675
- "name": "name",
4676
- "required": true,
4824
+ "from-file": {
4825
+ "description": "File with one keyword per line, combined with any --text values",
4826
+ "name": "from-file",
4677
4827
  "hasDynamicHelp": false,
4678
4828
  "multiple": false,
4679
4829
  "type": "option"
4680
4830
  },
4681
- "org": {
4682
- "description": "Campaign group ID (UUID) — see `adapty asa orgs list`",
4683
- "name": "org",
4684
- "required": true,
4831
+ "match-type": {
4832
+ "description": "Match type",
4833
+ "name": "match-type",
4834
+ "default": "BROAD",
4685
4835
  "hasDynamicHelp": false,
4686
4836
  "multiple": false,
4837
+ "options": [
4838
+ "BROAD",
4839
+ "EXACT"
4840
+ ],
4687
4841
  "type": "option"
4688
4842
  },
4689
4843
  "status": {
4690
- "description": "Initial status",
4844
+ "description": "Keyword status",
4691
4845
  "name": "status",
4846
+ "default": "ACTIVE",
4692
4847
  "hasDynamicHelp": false,
4693
4848
  "multiple": false,
4694
4849
  "options": [
4695
- "ENABLED",
4850
+ "ACTIVE",
4696
4851
  "PAUSED"
4697
4852
  ],
4698
4853
  "type": "option"
4699
4854
  },
4700
- "supply-source": {
4701
- "description": "Supply source, repeatable",
4702
- "name": "supply-source",
4703
- "default": [
4704
- "APPSTORE_SEARCH_RESULTS"
4705
- ],
4855
+ "text": {
4856
+ "description": "Keyword text, repeatable",
4857
+ "name": "text",
4706
4858
  "hasDynamicHelp": false,
4707
4859
  "multiple": true,
4708
4860
  "type": "option"
4709
- },
4710
- "target-cpa": {
4711
- "description": "Target CPA; must be lower than --daily-budget (amount, e.g. 50 or 12.50)",
4712
- "name": "target-cpa",
4713
- "hasDynamicHelp": false,
4714
- "multiple": false,
4715
- "type": "option"
4716
- }
4717
- },
4718
- "hasDynamicHelp": false,
4719
- "hiddenAliases": [],
4720
- "id": "asa:campaigns:create",
4721
- "pluginAlias": "adapty",
4722
- "pluginName": "adapty",
4723
- "pluginType": "core",
4724
- "strict": true,
4725
- "enableJsonFlag": true,
4726
- "isESM": true,
4727
- "relativePath": [
4728
- "dist",
4729
- "commands",
4730
- "asa",
4731
- "campaigns",
4732
- "create.js"
4733
- ]
4734
- },
4735
- "asa:campaigns:get": {
4736
- "aliases": [],
4737
- "args": {
4738
- "campaign_id": {
4739
- "description": "Campaign ID (UUID)",
4740
- "name": "campaign_id",
4741
- "required": true
4742
- }
4743
- },
4744
- "description": "Show one campaign; read numbers with asa metrics",
4745
- "examples": [
4746
- "<%= config.bin %> asa campaigns get 550e8400-e29b-41d4-a716-446655440000"
4747
- ],
4748
- "flags": {
4749
- "json": {
4750
- "description": "Format output as json.",
4751
- "helpGroup": "GLOBAL",
4752
- "name": "json",
4753
- "allowNo": false,
4754
- "type": "boolean"
4755
4861
  }
4756
4862
  },
4757
4863
  "hasDynamicHelp": false,
4758
4864
  "hiddenAliases": [],
4759
- "id": "asa:campaigns:get",
4865
+ "id": "asa:keywords:add",
4760
4866
  "pluginAlias": "adapty",
4761
4867
  "pluginName": "adapty",
4762
4868
  "pluginType": "core",
@@ -4767,17 +4873,17 @@
4767
4873
  "dist",
4768
4874
  "commands",
4769
4875
  "asa",
4770
- "campaigns",
4771
- "get.js"
4876
+ "keywords",
4877
+ "add.js"
4772
4878
  ]
4773
4879
  },
4774
- "asa:campaigns:list": {
4880
+ "asa:keywords:list": {
4775
4881
  "aliases": [],
4776
4882
  "args": {},
4777
- "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
4883
+ "description": "List targeting keywords; read numbers with asa metrics",
4778
4884
  "examples": [
4779
- "<%= config.bin %> asa campaigns list",
4780
- "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
4885
+ "<%= config.bin %> asa keywords list",
4886
+ "<%= config.bin %> asa keywords list --ad-group AD_GROUP_UUID --status ACTIVE"
4781
4887
  ],
4782
4888
  "flags": {
4783
4889
  "json": {
@@ -4824,13 +4930,27 @@
4824
4930
  "multiple": false,
4825
4931
  "type": "option"
4826
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
+ },
4827
4947
  "status": {
4828
4948
  "description": "Keep only rows in this state",
4829
4949
  "name": "status",
4830
4950
  "hasDynamicHelp": false,
4831
4951
  "multiple": false,
4832
4952
  "options": [
4833
- "ENABLED",
4953
+ "ACTIVE",
4834
4954
  "PAUSED"
4835
4955
  ],
4836
4956
  "type": "option"
@@ -4838,7 +4958,7 @@
4838
4958
  },
4839
4959
  "hasDynamicHelp": false,
4840
4960
  "hiddenAliases": [],
4841
- "id": "asa:campaigns:list",
4961
+ "id": "asa:keywords:list",
4842
4962
  "pluginAlias": "adapty",
4843
4963
  "pluginName": "adapty",
4844
4964
  "pluginType": "core",
@@ -4849,24 +4969,23 @@
4849
4969
  "dist",
4850
4970
  "commands",
4851
4971
  "asa",
4852
- "campaigns",
4972
+ "keywords",
4853
4973
  "list.js"
4854
4974
  ]
4855
4975
  },
4856
- "asa:campaigns:update": {
4976
+ "asa:keywords:update": {
4857
4977
  "aliases": [],
4858
4978
  "args": {
4859
- "campaign_id": {
4860
- "description": "Campaign ID (UUID)",
4861
- "name": "campaign_id",
4979
+ "keyword_id": {
4980
+ "description": "Keyword ID (UUID), repeatable as extra arguments",
4981
+ "name": "keyword_id",
4862
4982
  "required": true
4863
4983
  }
4864
4984
  },
4865
- "description": "Change a campaign: budgets, countries, status, schedule or Invoicing Options (all five --invoice-* flags together; they replace the stored set)",
4985
+ "description": "Change bid, status, text or match type of keywords",
4866
4986
  "examples": [
4867
- "<%= config.bin %> asa campaigns update UUID --status PAUSED",
4868
- "<%= config.bin %> asa campaigns update UUID --daily-budget 80",
4869
- "<%= 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"
4987
+ "<%= config.bin %> asa keywords update UUID --bid 2.00",
4988
+ "<%= config.bin %> asa keywords update UUID_A UUID_B --status PAUSED"
4870
4989
  ],
4871
4990
  "flags": {
4872
4991
  "json": {
@@ -4898,94 +5017,38 @@
4898
5017
  "multiple": false,
4899
5018
  "type": "option"
4900
5019
  },
4901
- "invoice-advertiser": {
4902
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): advertiser name",
4903
- "name": "invoice-advertiser",
4904
- "hasDynamicHelp": false,
4905
- "multiple": false,
4906
- "type": "option"
4907
- },
4908
- "invoice-billing-email": {
4909
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): billing contact email",
4910
- "name": "invoice-billing-email",
4911
- "hasDynamicHelp": false,
4912
- "multiple": false,
4913
- "type": "option"
4914
- },
4915
- "invoice-contact-email": {
4916
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact email",
4917
- "name": "invoice-contact-email",
4918
- "hasDynamicHelp": false,
4919
- "multiple": false,
4920
- "type": "option"
4921
- },
4922
- "invoice-contact-name": {
4923
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): buyer contact name",
4924
- "name": "invoice-contact-name",
4925
- "hasDynamicHelp": false,
4926
- "multiple": false,
4927
- "type": "option"
4928
- },
4929
- "invoice-order-number": {
4930
- "description": "Invoicing Options (line-of-credit orgs, see payment_model in asa orgs list): order number",
4931
- "name": "invoice-order-number",
5020
+ "bid": {
5021
+ "description": "Bid (amount, e.g. 50 or 12.50)",
5022
+ "name": "bid",
4932
5023
  "hasDynamicHelp": false,
4933
5024
  "multiple": false,
4934
5025
  "type": "option"
4935
5026
  },
4936
- "bidding-strategy": {
4937
- "description": "Bidding strategy",
4938
- "name": "bidding-strategy",
5027
+ "match-type": {
5028
+ "description": "Match type",
5029
+ "name": "match-type",
4939
5030
  "hasDynamicHelp": false,
4940
5031
  "multiple": false,
4941
5032
  "options": [
4942
- "MANUAL_CPT",
4943
- "MAX_CONVERSIONS"
5033
+ "BROAD",
5034
+ "EXACT"
4944
5035
  ],
4945
5036
  "type": "option"
4946
5037
  },
4947
- "budget": {
4948
- "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
4949
- "name": "budget",
4950
- "hasDynamicHelp": false,
4951
- "multiple": false,
4952
- "type": "option"
4953
- },
4954
- "country": {
4955
- "description": "Replace the country list, repeatable",
4956
- "name": "country",
4957
- "hasDynamicHelp": false,
4958
- "multiple": true,
4959
- "type": "option"
4960
- },
4961
- "daily-budget": {
4962
- "description": "Daily budget (amount, e.g. 50 or 12.50)",
4963
- "name": "daily-budget",
4964
- "hasDynamicHelp": false,
4965
- "multiple": false,
4966
- "type": "option"
4967
- },
4968
- "name": {
4969
- "description": "Campaign name",
4970
- "name": "name",
4971
- "hasDynamicHelp": false,
4972
- "multiple": false,
4973
- "type": "option"
4974
- },
4975
5038
  "status": {
4976
- "description": "Campaign status",
5039
+ "description": "Keyword status",
4977
5040
  "name": "status",
4978
5041
  "hasDynamicHelp": false,
4979
5042
  "multiple": false,
4980
5043
  "options": [
4981
- "ENABLED",
5044
+ "ACTIVE",
4982
5045
  "PAUSED"
4983
5046
  ],
4984
5047
  "type": "option"
4985
5048
  },
4986
- "target-cpa": {
4987
- "description": "Target CPA (amount, e.g. 50 or 12.50)",
4988
- "name": "target-cpa",
5049
+ "text": {
5050
+ "description": "Keyword text (only meaningful for a single keyword)",
5051
+ "name": "text",
4989
5052
  "hasDynamicHelp": false,
4990
5053
  "multiple": false,
4991
5054
  "type": "option"
@@ -4993,21 +5056,21 @@
4993
5056
  },
4994
5057
  "hasDynamicHelp": false,
4995
5058
  "hiddenAliases": [],
4996
- "id": "asa:campaigns: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
- "campaigns",
5070
+ "keywords",
5008
5071
  "update.js"
5009
5072
  ]
5010
5073
  }
5011
5074
  },
5012
- "version": "0.8.3-beta.0"
5075
+ "version": "0.8.3"
5013
5076
  }