adapty 0.8.0-beta.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -425,59 +425,36 @@
425
425
  "update.js"
426
426
  ]
427
427
  },
428
- "asa:connect": {
428
+ "auth:login": {
429
429
  "aliases": [],
430
430
  "args": {},
431
- "description": "Connect an Apple Search Ads account to this company",
431
+ "description": "Authenticate with Adapty via browser",
432
432
  "examples": [
433
- "<%= config.bin %> asa connect",
434
- "<%= config.bin %> asa connect --no-wait"
433
+ "<%= config.bin %> auth login"
435
434
  ],
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
- },
435
+ "flags": {},
459
436
  "hasDynamicHelp": false,
460
437
  "hiddenAliases": [],
461
- "id": "asa:connect",
438
+ "id": "auth:login",
462
439
  "pluginAlias": "adapty",
463
440
  "pluginName": "adapty",
464
441
  "pluginType": "core",
465
442
  "strict": true,
466
- "enableJsonFlag": true,
443
+ "enableJsonFlag": false,
467
444
  "isESM": true,
468
445
  "relativePath": [
469
446
  "dist",
470
447
  "commands",
471
- "asa",
472
- "connect.js"
448
+ "auth",
449
+ "login.js"
473
450
  ]
474
451
  },
475
- "asa:whoami": {
452
+ "auth:logout": {
476
453
  "aliases": [],
477
454
  "args": {},
478
- "description": "Show which company the token unlocks and whether Apple Ads is connected",
455
+ "description": "Remove stored authentication token",
479
456
  "examples": [
480
- "<%= config.bin %> asa whoami"
457
+ "<%= config.bin %> auth logout"
481
458
  ],
482
459
  "flags": {
483
460
  "json": {
@@ -490,7 +467,7 @@
490
467
  },
491
468
  "hasDynamicHelp": false,
492
469
  "hiddenAliases": [],
493
- "id": "asa:whoami",
470
+ "id": "auth:logout",
494
471
  "pluginAlias": "adapty",
495
472
  "pluginName": "adapty",
496
473
  "pluginType": "core",
@@ -500,40 +477,48 @@
500
477
  "relativePath": [
501
478
  "dist",
502
479
  "commands",
503
- "asa",
504
- "whoami.js"
480
+ "auth",
481
+ "logout.js"
505
482
  ]
506
483
  },
507
- "auth:login": {
484
+ "auth:revoke": {
508
485
  "aliases": [],
509
486
  "args": {},
510
- "description": "Authenticate with Adapty via browser",
487
+ "description": "Revoke the current authentication token",
511
488
  "examples": [
512
- "<%= config.bin %> auth login"
489
+ "<%= config.bin %> auth revoke"
513
490
  ],
514
- "flags": {},
491
+ "flags": {
492
+ "json": {
493
+ "description": "Format output as json.",
494
+ "helpGroup": "GLOBAL",
495
+ "name": "json",
496
+ "allowNo": false,
497
+ "type": "boolean"
498
+ }
499
+ },
515
500
  "hasDynamicHelp": false,
516
501
  "hiddenAliases": [],
517
- "id": "auth:login",
502
+ "id": "auth:revoke",
518
503
  "pluginAlias": "adapty",
519
504
  "pluginName": "adapty",
520
505
  "pluginType": "core",
521
506
  "strict": true,
522
- "enableJsonFlag": false,
507
+ "enableJsonFlag": true,
523
508
  "isESM": true,
524
509
  "relativePath": [
525
510
  "dist",
526
511
  "commands",
527
512
  "auth",
528
- "login.js"
513
+ "revoke.js"
529
514
  ]
530
515
  },
531
- "auth:logout": {
516
+ "auth:status": {
532
517
  "aliases": [],
533
518
  "args": {},
534
- "description": "Remove stored authentication token",
519
+ "description": "Show current authentication state (local only)",
535
520
  "examples": [
536
- "<%= config.bin %> auth logout"
521
+ "<%= config.bin %> auth status"
537
522
  ],
538
523
  "flags": {
539
524
  "json": {
@@ -546,7 +531,7 @@
546
531
  },
547
532
  "hasDynamicHelp": false,
548
533
  "hiddenAliases": [],
549
- "id": "auth:logout",
534
+ "id": "auth:status",
550
535
  "pluginAlias": "adapty",
551
536
  "pluginName": "adapty",
552
537
  "pluginType": "core",
@@ -557,15 +542,15 @@
557
542
  "dist",
558
543
  "commands",
559
544
  "auth",
560
- "logout.js"
545
+ "status.js"
561
546
  ]
562
547
  },
563
- "auth:revoke": {
548
+ "auth:whoami": {
564
549
  "aliases": [],
565
550
  "args": {},
566
- "description": "Revoke the current authentication token",
551
+ "description": "Show current user info from server (verifies token)",
567
552
  "examples": [
568
- "<%= config.bin %> auth revoke"
553
+ "<%= config.bin %> auth whoami"
569
554
  ],
570
555
  "flags": {
571
556
  "json": {
@@ -578,7 +563,7 @@
578
563
  },
579
564
  "hasDynamicHelp": false,
580
565
  "hiddenAliases": [],
581
- "id": "auth:revoke",
566
+ "id": "auth:whoami",
582
567
  "pluginAlias": "adapty",
583
568
  "pluginName": "adapty",
584
569
  "pluginType": "core",
@@ -589,15 +574,16 @@
589
574
  "dist",
590
575
  "commands",
591
576
  "auth",
592
- "revoke.js"
577
+ "whoami.js"
593
578
  ]
594
579
  },
595
- "auth:status": {
580
+ "asa:connect": {
596
581
  "aliases": [],
597
582
  "args": {},
598
- "description": "Show current authentication state (local only)",
583
+ "description": "Connect an Apple Search Ads account to this company",
599
584
  "examples": [
600
- "<%= config.bin %> auth status"
585
+ "<%= config.bin %> asa connect",
586
+ "<%= config.bin %> asa connect --no-wait"
601
587
  ],
602
588
  "flags": {
603
589
  "json": {
@@ -606,11 +592,25 @@
606
592
  "name": "json",
607
593
  "allowNo": false,
608
594
  "type": "boolean"
595
+ },
596
+ "timeout": {
597
+ "description": "Seconds to wait for the browser step",
598
+ "name": "timeout",
599
+ "default": 300,
600
+ "hasDynamicHelp": false,
601
+ "multiple": false,
602
+ "type": "option"
603
+ },
604
+ "wait": {
605
+ "description": "Wait until Apple Ads reports as connected",
606
+ "name": "wait",
607
+ "allowNo": true,
608
+ "type": "boolean"
609
609
  }
610
610
  },
611
611
  "hasDynamicHelp": false,
612
612
  "hiddenAliases": [],
613
- "id": "auth:status",
613
+ "id": "asa:connect",
614
614
  "pluginAlias": "adapty",
615
615
  "pluginName": "adapty",
616
616
  "pluginType": "core",
@@ -620,16 +620,16 @@
620
620
  "relativePath": [
621
621
  "dist",
622
622
  "commands",
623
- "auth",
624
- "status.js"
623
+ "asa",
624
+ "connect.js"
625
625
  ]
626
626
  },
627
- "auth:whoami": {
627
+ "asa:whoami": {
628
628
  "aliases": [],
629
629
  "args": {},
630
- "description": "Show current user info from server (verifies token)",
630
+ "description": "Show which company the token unlocks and whether Apple Ads is connected",
631
631
  "examples": [
632
- "<%= config.bin %> auth whoami"
632
+ "<%= config.bin %> asa whoami"
633
633
  ],
634
634
  "flags": {
635
635
  "json": {
@@ -642,7 +642,7 @@
642
642
  },
643
643
  "hasDynamicHelp": false,
644
644
  "hiddenAliases": [],
645
- "id": "auth:whoami",
645
+ "id": "asa:whoami",
646
646
  "pluginAlias": "adapty",
647
647
  "pluginName": "adapty",
648
648
  "pluginType": "core",
@@ -652,16 +652,16 @@
652
652
  "relativePath": [
653
653
  "dist",
654
654
  "commands",
655
- "auth",
655
+ "asa",
656
656
  "whoami.js"
657
657
  ]
658
658
  },
659
- "paywalls:create": {
659
+ "flows:create": {
660
660
  "aliases": [],
661
661
  "args": {},
662
- "description": "Create a paywall with products",
662
+ "description": "Create a flow (row only — write its config with `flows config update`)",
663
663
  "examples": [
664
- "<%= config.bin %> paywalls create --app UUID --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
664
+ "<%= config.bin %> flows create --app UUID --name \"Onboarding\""
665
665
  ],
666
666
  "flags": {
667
667
  "json": {
@@ -679,17 +679,9 @@
679
679
  "multiple": false,
680
680
  "type": "option"
681
681
  },
682
- "product-id": {
683
- "description": "Product ID (UUID). Repeat for multiple.",
684
- "name": "product-id",
685
- "required": true,
686
- "hasDynamicHelp": false,
687
- "multiple": true,
688
- "type": "option"
689
- },
690
- "title": {
691
- "description": "Paywall title",
692
- "name": "title",
682
+ "name": {
683
+ "description": "Flow name",
684
+ "name": "name",
693
685
  "required": true,
694
686
  "hasDynamicHelp": false,
695
687
  "multiple": false,
@@ -698,7 +690,7 @@
698
690
  },
699
691
  "hasDynamicHelp": false,
700
692
  "hiddenAliases": [],
701
- "id": "paywalls:create",
693
+ "id": "flows:create",
702
694
  "pluginAlias": "adapty",
703
695
  "pluginName": "adapty",
704
696
  "pluginType": "core",
@@ -708,22 +700,22 @@
708
700
  "relativePath": [
709
701
  "dist",
710
702
  "commands",
711
- "paywalls",
703
+ "flows",
712
704
  "create.js"
713
705
  ]
714
706
  },
715
- "paywalls:get": {
707
+ "flows:get": {
716
708
  "aliases": [],
717
709
  "args": {
718
- "paywall_id": {
719
- "description": "Paywall ID (UUID)",
720
- "name": "paywall_id",
710
+ "flow_id": {
711
+ "description": "Flow ID (UUID)",
712
+ "name": "flow_id",
721
713
  "required": true
722
714
  }
723
715
  },
724
- "description": "Get paywall details",
716
+ "description": "Get flow details",
725
717
  "examples": [
726
- "<%= config.bin %> paywalls get --app UUID 550e8400-e29b-41d4-a716-446655440000"
718
+ "<%= config.bin %> flows get --app UUID 550e8400-e29b-41d4-a716-446655440000"
727
719
  ],
728
720
  "flags": {
729
721
  "json": {
@@ -744,7 +736,7 @@
744
736
  },
745
737
  "hasDynamicHelp": false,
746
738
  "hiddenAliases": [],
747
- "id": "paywalls:get",
739
+ "id": "flows:get",
748
740
  "pluginAlias": "adapty",
749
741
  "pluginName": "adapty",
750
742
  "pluginType": "core",
@@ -754,16 +746,16 @@
754
746
  "relativePath": [
755
747
  "dist",
756
748
  "commands",
757
- "paywalls",
749
+ "flows",
758
750
  "get.js"
759
751
  ]
760
752
  },
761
- "paywalls:list": {
753
+ "flows:list": {
762
754
  "aliases": [],
763
755
  "args": {},
764
- "description": "List paywalls for an app",
756
+ "description": "List flows for an app",
765
757
  "examples": [
766
- "<%= config.bin %> paywalls list --app 550e8400-..."
758
+ "<%= config.bin %> flows list --app 550e8400-..."
767
759
  ],
768
760
  "flags": {
769
761
  "json": {
@@ -800,7 +792,7 @@
800
792
  },
801
793
  "hasDynamicHelp": false,
802
794
  "hiddenAliases": [],
803
- "id": "paywalls:list",
795
+ "id": "flows:list",
804
796
  "pluginAlias": "adapty",
805
797
  "pluginName": "adapty",
806
798
  "pluginType": "core",
@@ -810,22 +802,17 @@
810
802
  "relativePath": [
811
803
  "dist",
812
804
  "commands",
813
- "paywalls",
805
+ "flows",
814
806
  "list.js"
815
807
  ]
816
808
  },
817
- "paywalls:placements": {
809
+ "placements:create": {
818
810
  "aliases": [],
819
- "args": {
820
- "paywall_id": {
821
- "description": "Paywall ID (UUID)",
822
- "name": "paywall_id",
823
- "required": true
824
- }
825
- },
826
- "description": "List placements that currently use this paywall",
811
+ "args": {},
812
+ "description": "Create a placement with a paywall",
827
813
  "examples": [
828
- "<%= config.bin %> paywalls placements --app UUID 770e8400-e29b-41d4-a716-446655440002"
814
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
815
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
829
816
  ],
830
817
  "flags": {
831
818
  "json": {
@@ -842,11 +829,41 @@
842
829
  "hasDynamicHelp": false,
843
830
  "multiple": false,
844
831
  "type": "option"
832
+ },
833
+ "audiences": {
834
+ "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
835
+ "name": "audiences",
836
+ "hasDynamicHelp": false,
837
+ "multiple": false,
838
+ "type": "option"
839
+ },
840
+ "developer-id": {
841
+ "description": "Developer ID for the placement",
842
+ "name": "developer-id",
843
+ "required": true,
844
+ "hasDynamicHelp": false,
845
+ "multiple": false,
846
+ "type": "option"
847
+ },
848
+ "paywall-id": {
849
+ "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
850
+ "name": "paywall-id",
851
+ "hasDynamicHelp": false,
852
+ "multiple": false,
853
+ "type": "option"
854
+ },
855
+ "title": {
856
+ "description": "Placement title",
857
+ "name": "title",
858
+ "required": true,
859
+ "hasDynamicHelp": false,
860
+ "multiple": false,
861
+ "type": "option"
845
862
  }
846
863
  },
847
864
  "hasDynamicHelp": false,
848
865
  "hiddenAliases": [],
849
- "id": "paywalls:placements",
866
+ "id": "placements:create",
850
867
  "pluginAlias": "adapty",
851
868
  "pluginName": "adapty",
852
869
  "pluginType": "core",
@@ -856,22 +873,22 @@
856
873
  "relativePath": [
857
874
  "dist",
858
875
  "commands",
859
- "paywalls",
860
- "placements.js"
876
+ "placements",
877
+ "create.js"
861
878
  ]
862
879
  },
863
- "paywalls:update": {
880
+ "placements:get": {
864
881
  "aliases": [],
865
882
  "args": {
866
- "paywall_id": {
867
- "description": "Paywall ID (UUID)",
868
- "name": "paywall_id",
883
+ "placement_id": {
884
+ "description": "Placement ID (UUID)",
885
+ "name": "placement_id",
869
886
  "required": true
870
887
  }
871
888
  },
872
- "description": "Update a paywall",
889
+ "description": "Get placement details",
873
890
  "examples": [
874
- "<%= config.bin %> paywalls update --app UUID 550e8400-... --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
891
+ "<%= config.bin %> placements get --app UUID 550e8400-e29b-41d4-a716-446655440000"
875
892
  ],
876
893
  "flags": {
877
894
  "json": {
@@ -888,27 +905,11 @@
888
905
  "hasDynamicHelp": false,
889
906
  "multiple": false,
890
907
  "type": "option"
891
- },
892
- "product-id": {
893
- "description": "Product ID (UUID). Repeat for multiple.",
894
- "name": "product-id",
895
- "required": true,
896
- "hasDynamicHelp": false,
897
- "multiple": true,
898
- "type": "option"
899
- },
900
- "title": {
901
- "description": "Paywall title",
902
- "name": "title",
903
- "required": true,
904
- "hasDynamicHelp": false,
905
- "multiple": false,
906
- "type": "option"
907
908
  }
908
909
  },
909
910
  "hasDynamicHelp": false,
910
911
  "hiddenAliases": [],
911
- "id": "paywalls:update",
912
+ "id": "placements:get",
912
913
  "pluginAlias": "adapty",
913
914
  "pluginName": "adapty",
914
915
  "pluginType": "core",
@@ -918,22 +919,16 @@
918
919
  "relativePath": [
919
920
  "dist",
920
921
  "commands",
921
- "paywalls",
922
- "update.js"
922
+ "placements",
923
+ "get.js"
923
924
  ]
924
925
  },
925
- "segments:get": {
926
+ "placements:list": {
926
927
  "aliases": [],
927
- "args": {
928
- "segment_id": {
929
- "description": "Segment ID (UUID)",
930
- "name": "segment_id",
931
- "required": true
932
- }
933
- },
934
- "description": "Get segment details",
928
+ "args": {},
929
+ "description": "List placements for an app",
935
930
  "examples": [
936
- "<%= config.bin %> segments get --app UUID 550e8400-e29b-41d4-a716-446655440000"
931
+ "<%= config.bin %> placements list --app 550e8400-..."
937
932
  ],
938
933
  "flags": {
939
934
  "json": {
@@ -950,11 +945,27 @@
950
945
  "hasDynamicHelp": false,
951
946
  "multiple": false,
952
947
  "type": "option"
948
+ },
949
+ "page": {
950
+ "description": "Page number",
951
+ "name": "page",
952
+ "default": 1,
953
+ "hasDynamicHelp": false,
954
+ "multiple": false,
955
+ "type": "option"
956
+ },
957
+ "page-size": {
958
+ "description": "Items per page (max 100)",
959
+ "name": "page-size",
960
+ "default": 20,
961
+ "hasDynamicHelp": false,
962
+ "multiple": false,
963
+ "type": "option"
953
964
  }
954
965
  },
955
966
  "hasDynamicHelp": false,
956
967
  "hiddenAliases": [],
957
- "id": "segments:get",
968
+ "id": "placements:list",
958
969
  "pluginAlias": "adapty",
959
970
  "pluginName": "adapty",
960
971
  "pluginType": "core",
@@ -964,16 +975,23 @@
964
975
  "relativePath": [
965
976
  "dist",
966
977
  "commands",
967
- "segments",
968
- "get.js"
978
+ "placements",
979
+ "list.js"
969
980
  ]
970
981
  },
971
- "segments:list": {
982
+ "placements:update": {
972
983
  "aliases": [],
973
- "args": {},
974
- "description": "List segments for an app",
984
+ "args": {
985
+ "placement_id": {
986
+ "description": "Placement ID (UUID)",
987
+ "name": "placement_id",
988
+ "required": true
989
+ }
990
+ },
991
+ "description": "Update a placement",
975
992
  "examples": [
976
- "<%= config.bin %> segments list --app 550e8400-..."
993
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
994
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
977
995
  ],
978
996
  "flags": {
979
997
  "json": {
@@ -991,18 +1009,32 @@
991
1009
  "multiple": false,
992
1010
  "type": "option"
993
1011
  },
994
- "page": {
995
- "description": "Page number",
996
- "name": "page",
997
- "default": 1,
1012
+ "audiences": {
1013
+ "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1014
+ "name": "audiences",
998
1015
  "hasDynamicHelp": false,
999
1016
  "multiple": false,
1000
1017
  "type": "option"
1001
1018
  },
1002
- "page-size": {
1003
- "description": "Items per page (max 100)",
1004
- "name": "page-size",
1005
- "default": 20,
1019
+ "developer-id": {
1020
+ "description": "Developer ID for the placement",
1021
+ "name": "developer-id",
1022
+ "required": true,
1023
+ "hasDynamicHelp": false,
1024
+ "multiple": false,
1025
+ "type": "option"
1026
+ },
1027
+ "paywall-id": {
1028
+ "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1029
+ "name": "paywall-id",
1030
+ "hasDynamicHelp": false,
1031
+ "multiple": false,
1032
+ "type": "option"
1033
+ },
1034
+ "title": {
1035
+ "description": "Placement title",
1036
+ "name": "title",
1037
+ "required": true,
1006
1038
  "hasDynamicHelp": false,
1007
1039
  "multiple": false,
1008
1040
  "type": "option"
@@ -1010,7 +1042,7 @@
1010
1042
  },
1011
1043
  "hasDynamicHelp": false,
1012
1044
  "hiddenAliases": [],
1013
- "id": "segments:list",
1045
+ "id": "placements:update",
1014
1046
  "pluginAlias": "adapty",
1015
1047
  "pluginName": "adapty",
1016
1048
  "pluginType": "core",
@@ -1020,16 +1052,16 @@
1020
1052
  "relativePath": [
1021
1053
  "dist",
1022
1054
  "commands",
1023
- "segments",
1024
- "list.js"
1055
+ "placements",
1056
+ "update.js"
1025
1057
  ]
1026
1058
  },
1027
- "products:create": {
1059
+ "paywalls:create": {
1028
1060
  "aliases": [],
1029
1061
  "args": {},
1030
- "description": "Create a product with vendor products per platform",
1062
+ "description": "Create a paywall with products",
1031
1063
  "examples": [
1032
- "<%= config.bin %> products create --app UUID --title \"Monthly\" --access-level-id UUID --period monthly --ios-product-id com.example.monthly"
1064
+ "<%= config.bin %> paywalls create --app UUID --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
1033
1065
  ],
1034
1066
  "flags": {
1035
1067
  "json": {
@@ -1047,80 +1079,16 @@
1047
1079
  "multiple": false,
1048
1080
  "type": "option"
1049
1081
  },
1050
- "access-level-id": {
1051
- "description": "Access level ID (UUID)",
1052
- "name": "access-level-id",
1053
- "required": true,
1054
- "hasDynamicHelp": false,
1055
- "multiple": false,
1056
- "type": "option"
1057
- },
1058
- "android-base-plan-id": {
1059
- "description": "Android base plan ID",
1060
- "helpGroup": "STORE BINDINGS",
1061
- "name": "android-base-plan-id",
1062
- "hasDynamicHelp": false,
1063
- "multiple": false,
1064
- "type": "option"
1065
- },
1066
- "android-product-id": {
1067
- "description": "Android product ID",
1068
- "helpGroup": "STORE BINDINGS",
1069
- "name": "android-product-id",
1070
- "hasDynamicHelp": false,
1071
- "multiple": false,
1072
- "type": "option"
1073
- },
1074
- "ios-product-id": {
1075
- "description": "iOS product ID",
1076
- "helpGroup": "STORE BINDINGS",
1077
- "name": "ios-product-id",
1078
- "hasDynamicHelp": false,
1079
- "multiple": false,
1080
- "type": "option"
1081
- },
1082
- "paddle-price-id": {
1083
- "description": "Paddle price ID (requires --paddle-product-id)",
1084
- "helpGroup": "STORE BINDINGS",
1085
- "name": "paddle-price-id",
1086
- "hasDynamicHelp": false,
1087
- "multiple": false,
1088
- "type": "option"
1089
- },
1090
- "paddle-product-id": {
1091
- "description": "Paddle product ID (requires --paddle-price-id)",
1092
- "helpGroup": "STORE BINDINGS",
1093
- "name": "paddle-product-id",
1094
- "hasDynamicHelp": false,
1095
- "multiple": false,
1096
- "type": "option"
1097
- },
1098
- "period": {
1099
- "description": "Subscription period (weekly, monthly, two_months, trimonthly, semiannual, annual, lifetime)",
1100
- "name": "period",
1082
+ "product-id": {
1083
+ "description": "Product ID (UUID). Repeat for multiple.",
1084
+ "name": "product-id",
1101
1085
  "required": true,
1102
1086
  "hasDynamicHelp": false,
1103
- "multiple": false,
1104
- "type": "option"
1105
- },
1106
- "stripe-price-id": {
1107
- "description": "Stripe price ID (requires --stripe-product-id)",
1108
- "helpGroup": "STORE BINDINGS",
1109
- "name": "stripe-price-id",
1110
- "hasDynamicHelp": false,
1111
- "multiple": false,
1112
- "type": "option"
1113
- },
1114
- "stripe-product-id": {
1115
- "description": "Stripe product ID (requires --stripe-price-id)",
1116
- "helpGroup": "STORE BINDINGS",
1117
- "name": "stripe-product-id",
1118
- "hasDynamicHelp": false,
1119
- "multiple": false,
1087
+ "multiple": true,
1120
1088
  "type": "option"
1121
1089
  },
1122
1090
  "title": {
1123
- "description": "Product title",
1091
+ "description": "Paywall title",
1124
1092
  "name": "title",
1125
1093
  "required": true,
1126
1094
  "hasDynamicHelp": false,
@@ -1130,7 +1098,7 @@
1130
1098
  },
1131
1099
  "hasDynamicHelp": false,
1132
1100
  "hiddenAliases": [],
1133
- "id": "products:create",
1101
+ "id": "paywalls:create",
1134
1102
  "pluginAlias": "adapty",
1135
1103
  "pluginName": "adapty",
1136
1104
  "pluginType": "core",
@@ -1140,22 +1108,22 @@
1140
1108
  "relativePath": [
1141
1109
  "dist",
1142
1110
  "commands",
1143
- "products",
1111
+ "paywalls",
1144
1112
  "create.js"
1145
1113
  ]
1146
1114
  },
1147
- "products:get": {
1115
+ "paywalls:get": {
1148
1116
  "aliases": [],
1149
1117
  "args": {
1150
- "product_id": {
1151
- "description": "Product ID (UUID)",
1152
- "name": "product_id",
1118
+ "paywall_id": {
1119
+ "description": "Paywall ID (UUID)",
1120
+ "name": "paywall_id",
1153
1121
  "required": true
1154
1122
  }
1155
1123
  },
1156
- "description": "Get product details",
1124
+ "description": "Get paywall details",
1157
1125
  "examples": [
1158
- "<%= config.bin %> products get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1126
+ "<%= config.bin %> paywalls get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1159
1127
  ],
1160
1128
  "flags": {
1161
1129
  "json": {
@@ -1176,7 +1144,7 @@
1176
1144
  },
1177
1145
  "hasDynamicHelp": false,
1178
1146
  "hiddenAliases": [],
1179
- "id": "products:get",
1147
+ "id": "paywalls:get",
1180
1148
  "pluginAlias": "adapty",
1181
1149
  "pluginName": "adapty",
1182
1150
  "pluginType": "core",
@@ -1186,16 +1154,16 @@
1186
1154
  "relativePath": [
1187
1155
  "dist",
1188
1156
  "commands",
1189
- "products",
1157
+ "paywalls",
1190
1158
  "get.js"
1191
1159
  ]
1192
1160
  },
1193
- "products:list": {
1161
+ "paywalls:list": {
1194
1162
  "aliases": [],
1195
1163
  "args": {},
1196
- "description": "List products for an app",
1164
+ "description": "List paywalls for an app",
1197
1165
  "examples": [
1198
- "<%= config.bin %> products list --app 550e8400-..."
1166
+ "<%= config.bin %> paywalls list --app 550e8400-..."
1199
1167
  ],
1200
1168
  "flags": {
1201
1169
  "json": {
@@ -1232,7 +1200,7 @@
1232
1200
  },
1233
1201
  "hasDynamicHelp": false,
1234
1202
  "hiddenAliases": [],
1235
- "id": "products:list",
1203
+ "id": "paywalls:list",
1236
1204
  "pluginAlias": "adapty",
1237
1205
  "pluginName": "adapty",
1238
1206
  "pluginType": "core",
@@ -1242,22 +1210,22 @@
1242
1210
  "relativePath": [
1243
1211
  "dist",
1244
1212
  "commands",
1245
- "products",
1213
+ "paywalls",
1246
1214
  "list.js"
1247
1215
  ]
1248
1216
  },
1249
- "products:update": {
1217
+ "paywalls:placements": {
1250
1218
  "aliases": [],
1251
1219
  "args": {
1252
- "product_id": {
1253
- "description": "Product ID (UUID)",
1254
- "name": "product_id",
1220
+ "paywall_id": {
1221
+ "description": "Paywall ID (UUID)",
1222
+ "name": "paywall_id",
1255
1223
  "required": true
1256
1224
  }
1257
1225
  },
1258
- "description": "Update a product (title and access level only)",
1226
+ "description": "List placements that currently use this paywall",
1259
1227
  "examples": [
1260
- "<%= config.bin %> products update --app UUID 550e8400-... --title \"Monthly\" --access-level-id UUID"
1228
+ "<%= config.bin %> paywalls placements --app UUID 770e8400-e29b-41d4-a716-446655440002"
1261
1229
  ],
1262
1230
  "flags": {
1263
1231
  "json": {
@@ -1274,27 +1242,11 @@
1274
1242
  "hasDynamicHelp": false,
1275
1243
  "multiple": false,
1276
1244
  "type": "option"
1277
- },
1278
- "access-level-id": {
1279
- "description": "Access level ID (UUID)",
1280
- "name": "access-level-id",
1281
- "required": true,
1282
- "hasDynamicHelp": false,
1283
- "multiple": false,
1284
- "type": "option"
1285
- },
1286
- "title": {
1287
- "description": "Product title",
1288
- "name": "title",
1289
- "required": true,
1290
- "hasDynamicHelp": false,
1291
- "multiple": false,
1292
- "type": "option"
1293
1245
  }
1294
1246
  },
1295
1247
  "hasDynamicHelp": false,
1296
1248
  "hiddenAliases": [],
1297
- "id": "products:update",
1249
+ "id": "paywalls:placements",
1298
1250
  "pluginAlias": "adapty",
1299
1251
  "pluginName": "adapty",
1300
1252
  "pluginType": "core",
@@ -1304,16 +1256,22 @@
1304
1256
  "relativePath": [
1305
1257
  "dist",
1306
1258
  "commands",
1307
- "products",
1308
- "update.js"
1259
+ "paywalls",
1260
+ "placements.js"
1309
1261
  ]
1310
1262
  },
1311
- "flows:create": {
1263
+ "paywalls:update": {
1312
1264
  "aliases": [],
1313
- "args": {},
1314
- "description": "Create a flow (row only — write its config with `flows config update`)",
1265
+ "args": {
1266
+ "paywall_id": {
1267
+ "description": "Paywall ID (UUID)",
1268
+ "name": "paywall_id",
1269
+ "required": true
1270
+ }
1271
+ },
1272
+ "description": "Update a paywall",
1315
1273
  "examples": [
1316
- "<%= config.bin %> flows create --app UUID --name \"Onboarding\""
1274
+ "<%= config.bin %> paywalls update --app UUID 550e8400-... --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
1317
1275
  ],
1318
1276
  "flags": {
1319
1277
  "json": {
@@ -1331,9 +1289,17 @@
1331
1289
  "multiple": false,
1332
1290
  "type": "option"
1333
1291
  },
1334
- "name": {
1335
- "description": "Flow name",
1336
- "name": "name",
1292
+ "product-id": {
1293
+ "description": "Product ID (UUID). Repeat for multiple.",
1294
+ "name": "product-id",
1295
+ "required": true,
1296
+ "hasDynamicHelp": false,
1297
+ "multiple": true,
1298
+ "type": "option"
1299
+ },
1300
+ "title": {
1301
+ "description": "Paywall title",
1302
+ "name": "title",
1337
1303
  "required": true,
1338
1304
  "hasDynamicHelp": false,
1339
1305
  "multiple": false,
@@ -1342,7 +1308,7 @@
1342
1308
  },
1343
1309
  "hasDynamicHelp": false,
1344
1310
  "hiddenAliases": [],
1345
- "id": "flows:create",
1311
+ "id": "paywalls:update",
1346
1312
  "pluginAlias": "adapty",
1347
1313
  "pluginName": "adapty",
1348
1314
  "pluginType": "core",
@@ -1352,22 +1318,22 @@
1352
1318
  "relativePath": [
1353
1319
  "dist",
1354
1320
  "commands",
1355
- "flows",
1356
- "create.js"
1321
+ "paywalls",
1322
+ "update.js"
1357
1323
  ]
1358
1324
  },
1359
- "flows:get": {
1325
+ "segments:get": {
1360
1326
  "aliases": [],
1361
1327
  "args": {
1362
- "flow_id": {
1363
- "description": "Flow ID (UUID)",
1364
- "name": "flow_id",
1328
+ "segment_id": {
1329
+ "description": "Segment ID (UUID)",
1330
+ "name": "segment_id",
1365
1331
  "required": true
1366
1332
  }
1367
1333
  },
1368
- "description": "Get flow details",
1334
+ "description": "Get segment details",
1369
1335
  "examples": [
1370
- "<%= config.bin %> flows get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1336
+ "<%= config.bin %> segments get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1371
1337
  ],
1372
1338
  "flags": {
1373
1339
  "json": {
@@ -1388,7 +1354,7 @@
1388
1354
  },
1389
1355
  "hasDynamicHelp": false,
1390
1356
  "hiddenAliases": [],
1391
- "id": "flows:get",
1357
+ "id": "segments:get",
1392
1358
  "pluginAlias": "adapty",
1393
1359
  "pluginName": "adapty",
1394
1360
  "pluginType": "core",
@@ -1398,16 +1364,16 @@
1398
1364
  "relativePath": [
1399
1365
  "dist",
1400
1366
  "commands",
1401
- "flows",
1367
+ "segments",
1402
1368
  "get.js"
1403
1369
  ]
1404
1370
  },
1405
- "flows:list": {
1371
+ "segments:list": {
1406
1372
  "aliases": [],
1407
1373
  "args": {},
1408
- "description": "List flows for an app",
1374
+ "description": "List segments for an app",
1409
1375
  "examples": [
1410
- "<%= config.bin %> flows list --app 550e8400-..."
1376
+ "<%= config.bin %> segments list --app 550e8400-..."
1411
1377
  ],
1412
1378
  "flags": {
1413
1379
  "json": {
@@ -1444,7 +1410,7 @@
1444
1410
  },
1445
1411
  "hasDynamicHelp": false,
1446
1412
  "hiddenAliases": [],
1447
- "id": "flows:list",
1413
+ "id": "segments:list",
1448
1414
  "pluginAlias": "adapty",
1449
1415
  "pluginName": "adapty",
1450
1416
  "pluginType": "core",
@@ -1454,17 +1420,16 @@
1454
1420
  "relativePath": [
1455
1421
  "dist",
1456
1422
  "commands",
1457
- "flows",
1423
+ "segments",
1458
1424
  "list.js"
1459
1425
  ]
1460
1426
  },
1461
- "placements:create": {
1427
+ "products:create": {
1462
1428
  "aliases": [],
1463
1429
  "args": {},
1464
- "description": "Create a placement with a paywall",
1430
+ "description": "Create a product with vendor products per platform",
1465
1431
  "examples": [
1466
- "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1467
- "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
1432
+ "<%= config.bin %> products create --app UUID --title \"Monthly\" --access-level-id UUID --period monthly --ios-product-id com.example.monthly"
1468
1433
  ],
1469
1434
  "flags": {
1470
1435
  "json": {
@@ -1482,30 +1447,80 @@
1482
1447
  "multiple": false,
1483
1448
  "type": "option"
1484
1449
  },
1485
- "audiences": {
1486
- "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1487
- "name": "audiences",
1450
+ "access-level-id": {
1451
+ "description": "Access level ID (UUID)",
1452
+ "name": "access-level-id",
1453
+ "required": true,
1488
1454
  "hasDynamicHelp": false,
1489
1455
  "multiple": false,
1490
1456
  "type": "option"
1491
1457
  },
1492
- "developer-id": {
1493
- "description": "Developer ID for the placement",
1494
- "name": "developer-id",
1458
+ "android-base-plan-id": {
1459
+ "description": "Android base plan ID",
1460
+ "helpGroup": "STORE BINDINGS",
1461
+ "name": "android-base-plan-id",
1462
+ "hasDynamicHelp": false,
1463
+ "multiple": false,
1464
+ "type": "option"
1465
+ },
1466
+ "android-product-id": {
1467
+ "description": "Android product ID",
1468
+ "helpGroup": "STORE BINDINGS",
1469
+ "name": "android-product-id",
1470
+ "hasDynamicHelp": false,
1471
+ "multiple": false,
1472
+ "type": "option"
1473
+ },
1474
+ "ios-product-id": {
1475
+ "description": "iOS product ID",
1476
+ "helpGroup": "STORE BINDINGS",
1477
+ "name": "ios-product-id",
1478
+ "hasDynamicHelp": false,
1479
+ "multiple": false,
1480
+ "type": "option"
1481
+ },
1482
+ "paddle-price-id": {
1483
+ "description": "Paddle price ID (requires --paddle-product-id)",
1484
+ "helpGroup": "STORE BINDINGS",
1485
+ "name": "paddle-price-id",
1486
+ "hasDynamicHelp": false,
1487
+ "multiple": false,
1488
+ "type": "option"
1489
+ },
1490
+ "paddle-product-id": {
1491
+ "description": "Paddle product ID (requires --paddle-price-id)",
1492
+ "helpGroup": "STORE BINDINGS",
1493
+ "name": "paddle-product-id",
1494
+ "hasDynamicHelp": false,
1495
+ "multiple": false,
1496
+ "type": "option"
1497
+ },
1498
+ "period": {
1499
+ "description": "Subscription period (weekly, monthly, two_months, trimonthly, semiannual, annual, lifetime)",
1500
+ "name": "period",
1495
1501
  "required": true,
1496
1502
  "hasDynamicHelp": false,
1497
1503
  "multiple": false,
1498
1504
  "type": "option"
1499
1505
  },
1500
- "paywall-id": {
1501
- "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1502
- "name": "paywall-id",
1506
+ "stripe-price-id": {
1507
+ "description": "Stripe price ID (requires --stripe-product-id)",
1508
+ "helpGroup": "STORE BINDINGS",
1509
+ "name": "stripe-price-id",
1510
+ "hasDynamicHelp": false,
1511
+ "multiple": false,
1512
+ "type": "option"
1513
+ },
1514
+ "stripe-product-id": {
1515
+ "description": "Stripe product ID (requires --stripe-price-id)",
1516
+ "helpGroup": "STORE BINDINGS",
1517
+ "name": "stripe-product-id",
1503
1518
  "hasDynamicHelp": false,
1504
1519
  "multiple": false,
1505
1520
  "type": "option"
1506
1521
  },
1507
1522
  "title": {
1508
- "description": "Placement title",
1523
+ "description": "Product title",
1509
1524
  "name": "title",
1510
1525
  "required": true,
1511
1526
  "hasDynamicHelp": false,
@@ -1515,7 +1530,7 @@
1515
1530
  },
1516
1531
  "hasDynamicHelp": false,
1517
1532
  "hiddenAliases": [],
1518
- "id": "placements:create",
1533
+ "id": "products:create",
1519
1534
  "pluginAlias": "adapty",
1520
1535
  "pluginName": "adapty",
1521
1536
  "pluginType": "core",
@@ -1525,22 +1540,22 @@
1525
1540
  "relativePath": [
1526
1541
  "dist",
1527
1542
  "commands",
1528
- "placements",
1543
+ "products",
1529
1544
  "create.js"
1530
1545
  ]
1531
1546
  },
1532
- "placements:get": {
1547
+ "products:get": {
1533
1548
  "aliases": [],
1534
1549
  "args": {
1535
- "placement_id": {
1536
- "description": "Placement ID (UUID)",
1537
- "name": "placement_id",
1550
+ "product_id": {
1551
+ "description": "Product ID (UUID)",
1552
+ "name": "product_id",
1538
1553
  "required": true
1539
1554
  }
1540
1555
  },
1541
- "description": "Get placement details",
1556
+ "description": "Get product details",
1542
1557
  "examples": [
1543
- "<%= config.bin %> placements get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1558
+ "<%= config.bin %> products get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1544
1559
  ],
1545
1560
  "flags": {
1546
1561
  "json": {
@@ -1561,7 +1576,7 @@
1561
1576
  },
1562
1577
  "hasDynamicHelp": false,
1563
1578
  "hiddenAliases": [],
1564
- "id": "placements:get",
1579
+ "id": "products:get",
1565
1580
  "pluginAlias": "adapty",
1566
1581
  "pluginName": "adapty",
1567
1582
  "pluginType": "core",
@@ -1571,16 +1586,16 @@
1571
1586
  "relativePath": [
1572
1587
  "dist",
1573
1588
  "commands",
1574
- "placements",
1589
+ "products",
1575
1590
  "get.js"
1576
1591
  ]
1577
1592
  },
1578
- "placements:list": {
1593
+ "products:list": {
1579
1594
  "aliases": [],
1580
1595
  "args": {},
1581
- "description": "List placements for an app",
1596
+ "description": "List products for an app",
1582
1597
  "examples": [
1583
- "<%= config.bin %> placements list --app 550e8400-..."
1598
+ "<%= config.bin %> products list --app 550e8400-..."
1584
1599
  ],
1585
1600
  "flags": {
1586
1601
  "json": {
@@ -1617,7 +1632,7 @@
1617
1632
  },
1618
1633
  "hasDynamicHelp": false,
1619
1634
  "hiddenAliases": [],
1620
- "id": "placements:list",
1635
+ "id": "products:list",
1621
1636
  "pluginAlias": "adapty",
1622
1637
  "pluginName": "adapty",
1623
1638
  "pluginType": "core",
@@ -1627,23 +1642,22 @@
1627
1642
  "relativePath": [
1628
1643
  "dist",
1629
1644
  "commands",
1630
- "placements",
1645
+ "products",
1631
1646
  "list.js"
1632
1647
  ]
1633
1648
  },
1634
- "placements:update": {
1649
+ "products:update": {
1635
1650
  "aliases": [],
1636
1651
  "args": {
1637
- "placement_id": {
1638
- "description": "Placement ID (UUID)",
1639
- "name": "placement_id",
1652
+ "product_id": {
1653
+ "description": "Product ID (UUID)",
1654
+ "name": "product_id",
1640
1655
  "required": true
1641
1656
  }
1642
1657
  },
1643
- "description": "Update a placement",
1658
+ "description": "Update a product (title and access level only)",
1644
1659
  "examples": [
1645
- "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1646
- "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
1660
+ "<%= config.bin %> products update --app UUID 550e8400-... --title \"Monthly\" --access-level-id UUID"
1647
1661
  ],
1648
1662
  "flags": {
1649
1663
  "json": {
@@ -1661,30 +1675,16 @@
1661
1675
  "multiple": false,
1662
1676
  "type": "option"
1663
1677
  },
1664
- "audiences": {
1665
- "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1666
- "name": "audiences",
1667
- "hasDynamicHelp": false,
1668
- "multiple": false,
1669
- "type": "option"
1670
- },
1671
- "developer-id": {
1672
- "description": "Developer ID for the placement",
1673
- "name": "developer-id",
1678
+ "access-level-id": {
1679
+ "description": "Access level ID (UUID)",
1680
+ "name": "access-level-id",
1674
1681
  "required": true,
1675
1682
  "hasDynamicHelp": false,
1676
1683
  "multiple": false,
1677
1684
  "type": "option"
1678
1685
  },
1679
- "paywall-id": {
1680
- "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1681
- "name": "paywall-id",
1682
- "hasDynamicHelp": false,
1683
- "multiple": false,
1684
- "type": "option"
1685
- },
1686
1686
  "title": {
1687
- "description": "Placement title",
1687
+ "description": "Product title",
1688
1688
  "name": "title",
1689
1689
  "required": true,
1690
1690
  "hasDynamicHelp": false,
@@ -1694,7 +1694,7 @@
1694
1694
  },
1695
1695
  "hasDynamicHelp": false,
1696
1696
  "hiddenAliases": [],
1697
- "id": "placements:update",
1697
+ "id": "products:update",
1698
1698
  "pluginAlias": "adapty",
1699
1699
  "pluginName": "adapty",
1700
1700
  "pluginType": "core",
@@ -1704,17 +1704,16 @@
1704
1704
  "relativePath": [
1705
1705
  "dist",
1706
1706
  "commands",
1707
- "placements",
1707
+ "products",
1708
1708
  "update.js"
1709
1709
  ]
1710
1710
  },
1711
- "asa:ad-groups:create": {
1711
+ "asa:ads:create": {
1712
1712
  "aliases": [],
1713
1713
  "args": {},
1714
- "description": "Create an ad group inside a campaign",
1714
+ "description": "Create an ad from a creative in an ad group",
1715
1715
  "examples": [
1716
- "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20",
1717
- "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20 --start-time 2026-09-01 --pricing-model CPM"
1716
+ "<%= config.bin %> asa ads create --ad-group UUID --creative-id 4321 --name \"Summer ad\""
1718
1717
  ],
1719
1718
  "flags": {
1720
1719
  "json": {
@@ -1724,40 +1723,6 @@
1724
1723
  "allowNo": false,
1725
1724
  "type": "boolean"
1726
1725
  },
1727
- "currency": {
1728
- "description": "Currency code for the amounts in this call",
1729
- "name": "currency",
1730
- "default": "USD",
1731
- "hasDynamicHelp": false,
1732
- "multiple": false,
1733
- "type": "option"
1734
- },
1735
- "end-time": {
1736
- "description": "Schedule end (YYYY-MM-DD)",
1737
- "name": "end-time",
1738
- "hasDynamicHelp": false,
1739
- "multiple": false,
1740
- "type": "option"
1741
- },
1742
- "start-time": {
1743
- "description": "Schedule start (YYYY-MM-DD), defaults to today",
1744
- "name": "start-time",
1745
- "hasDynamicHelp": false,
1746
- "multiple": false,
1747
- "type": "option"
1748
- },
1749
- "pricing-model": {
1750
- "description": "Pricing model; Apple requires one on every ad group",
1751
- "name": "pricing-model",
1752
- "default": "CPC",
1753
- "hasDynamicHelp": false,
1754
- "multiple": false,
1755
- "options": [
1756
- "CPC",
1757
- "CPM"
1758
- ],
1759
- "type": "option"
1760
- },
1761
1726
  "yes": {
1762
1727
  "char": "y",
1763
1728
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -1772,38 +1737,25 @@
1772
1737
  "multiple": false,
1773
1738
  "type": "option"
1774
1739
  },
1775
- "automated-keywords": {
1776
- "description": "Let Apple add keywords automatically",
1777
- "name": "automated-keywords",
1778
- "allowNo": true,
1779
- "type": "boolean"
1780
- },
1781
- "campaign": {
1782
- "description": "Campaign ID (UUID)",
1783
- "name": "campaign",
1740
+ "ad-group": {
1741
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
1742
+ "name": "ad-group",
1784
1743
  "required": true,
1785
1744
  "hasDynamicHelp": false,
1786
1745
  "multiple": false,
1787
1746
  "type": "option"
1788
1747
  },
1789
- "cpa-goal": {
1790
- "description": "CPA goal (amount, e.g. 50 or 12.50)",
1791
- "name": "cpa-goal",
1748
+ "creative-id": {
1749
+ "description": "Apple creative ID from a product page or the default set",
1750
+ "name": "creative-id",
1751
+ "required": true,
1792
1752
  "hasDynamicHelp": false,
1793
1753
  "multiple": false,
1794
1754
  "type": "option"
1795
1755
  },
1796
- "default-bid": {
1797
- "description": "Default bid (amount, e.g. 50 or 12.50)",
1798
- "name": "default-bid",
1799
- "required": true,
1800
- "hasDynamicHelp": false,
1801
- "multiple": false,
1802
- "type": "option"
1803
- },
1804
- "name": {
1805
- "description": "Ad group name",
1806
- "name": "name",
1756
+ "name": {
1757
+ "description": "Ad name",
1758
+ "name": "name",
1807
1759
  "required": true,
1808
1760
  "hasDynamicHelp": false,
1809
1761
  "multiple": false,
@@ -1823,7 +1775,7 @@
1823
1775
  },
1824
1776
  "hasDynamicHelp": false,
1825
1777
  "hiddenAliases": [],
1826
- "id": "asa:ad-groups:create",
1778
+ "id": "asa:ads:create",
1827
1779
  "pluginAlias": "adapty",
1828
1780
  "pluginName": "adapty",
1829
1781
  "pluginType": "core",
@@ -1834,22 +1786,22 @@
1834
1786
  "dist",
1835
1787
  "commands",
1836
1788
  "asa",
1837
- "ad-groups",
1789
+ "ads",
1838
1790
  "create.js"
1839
1791
  ]
1840
1792
  },
1841
- "asa:ad-groups:get": {
1793
+ "asa:ads:get": {
1842
1794
  "aliases": [],
1843
1795
  "args": {
1844
- "ad_group_id": {
1845
- "description": "Ad group ID (UUID)",
1846
- "name": "ad_group_id",
1796
+ "ad_id": {
1797
+ "description": "Ad ID (UUID)",
1798
+ "name": "ad_id",
1847
1799
  "required": true
1848
1800
  }
1849
1801
  },
1850
- "description": "Show one ad group; read numbers with asa metrics",
1802
+ "description": "Show one ad and its serving state",
1851
1803
  "examples": [
1852
- "<%= config.bin %> asa ad-groups get 550e8400-e29b-41d4-a716-446655440000"
1804
+ "<%= config.bin %> asa ads get 550e8400-e29b-41d4-a716-446655440000"
1853
1805
  ],
1854
1806
  "flags": {
1855
1807
  "json": {
@@ -1862,7 +1814,7 @@
1862
1814
  },
1863
1815
  "hasDynamicHelp": false,
1864
1816
  "hiddenAliases": [],
1865
- "id": "asa:ad-groups:get",
1817
+ "id": "asa:ads:get",
1866
1818
  "pluginAlias": "adapty",
1867
1819
  "pluginName": "adapty",
1868
1820
  "pluginType": "core",
@@ -1873,17 +1825,17 @@
1873
1825
  "dist",
1874
1826
  "commands",
1875
1827
  "asa",
1876
- "ad-groups",
1828
+ "ads",
1877
1829
  "get.js"
1878
1830
  ]
1879
1831
  },
1880
- "asa:ad-groups:list": {
1832
+ "asa:ads:list": {
1881
1833
  "aliases": [],
1882
1834
  "args": {},
1883
- "description": "List ad groups; read numbers with asa metrics",
1835
+ "description": "List ads; serving_state_reasons explains why an enabled ad is not running",
1884
1836
  "examples": [
1885
- "<%= config.bin %> asa ad-groups list",
1886
- "<%= config.bin %> asa ad-groups list --campaign CAMPAIGN_UUID"
1837
+ "<%= config.bin %> asa ads list",
1838
+ "<%= config.bin %> asa ads list --ad-group AD_GROUP_UUID --status ENABLED"
1887
1839
  ],
1888
1840
  "flags": {
1889
1841
  "json": {
@@ -1909,9 +1861,16 @@
1909
1861
  "multiple": false,
1910
1862
  "type": "option"
1911
1863
  },
1912
- "app": {
1913
- "description": "Keep only rows in this app; repeatable",
1914
- "name": "app",
1864
+ "ad-group": {
1865
+ "description": "Keep only rows in this ad group; repeatable",
1866
+ "name": "ad-group",
1867
+ "hasDynamicHelp": false,
1868
+ "multiple": true,
1869
+ "type": "option"
1870
+ },
1871
+ "campaign": {
1872
+ "description": "Keep only rows in this campaign; repeatable",
1873
+ "name": "campaign",
1915
1874
  "hasDynamicHelp": false,
1916
1875
  "multiple": true,
1917
1876
  "type": "option"
@@ -1930,13 +1889,6 @@
1930
1889
  "multiple": false,
1931
1890
  "type": "option"
1932
1891
  },
1933
- "campaign": {
1934
- "description": "Keep only rows in this campaign; repeatable",
1935
- "name": "campaign",
1936
- "hasDynamicHelp": false,
1937
- "multiple": true,
1938
- "type": "option"
1939
- },
1940
1892
  "status": {
1941
1893
  "description": "Keep only rows in this state",
1942
1894
  "name": "status",
@@ -1951,7 +1903,7 @@
1951
1903
  },
1952
1904
  "hasDynamicHelp": false,
1953
1905
  "hiddenAliases": [],
1954
- "id": "asa:ad-groups:list",
1906
+ "id": "asa:ads:list",
1955
1907
  "pluginAlias": "adapty",
1956
1908
  "pluginName": "adapty",
1957
1909
  "pluginType": "core",
@@ -1962,23 +1914,22 @@
1962
1914
  "dist",
1963
1915
  "commands",
1964
1916
  "asa",
1965
- "ad-groups",
1917
+ "ads",
1966
1918
  "list.js"
1967
1919
  ]
1968
1920
  },
1969
- "asa:ad-groups:update": {
1921
+ "asa:ads:update": {
1970
1922
  "aliases": [],
1971
1923
  "args": {
1972
- "ad_group_id": {
1973
- "description": "Ad group ID (UUID)",
1974
- "name": "ad_group_id",
1924
+ "ad_id": {
1925
+ "description": "Ad ID (UUID)",
1926
+ "name": "ad_id",
1975
1927
  "required": true
1976
1928
  }
1977
1929
  },
1978
- "description": "Change an ad group: bid, CPA goal, status or schedule",
1930
+ "description": "Rename an ad or pause it; the creative and ad group are fixed at creation",
1979
1931
  "examples": [
1980
- "<%= config.bin %> asa ad-groups update UUID --default-bid 1.50",
1981
- "<%= config.bin %> asa ad-groups update UUID --status PAUSED"
1932
+ "<%= config.bin %> asa ads update UUID --status PAUSED"
1982
1933
  ],
1983
1934
  "flags": {
1984
1935
  "json": {
@@ -1988,28 +1939,6 @@
1988
1939
  "allowNo": false,
1989
1940
  "type": "boolean"
1990
1941
  },
1991
- "currency": {
1992
- "description": "Currency code for the amounts in this call",
1993
- "name": "currency",
1994
- "default": "USD",
1995
- "hasDynamicHelp": false,
1996
- "multiple": false,
1997
- "type": "option"
1998
- },
1999
- "end-time": {
2000
- "description": "Schedule end (YYYY-MM-DD)",
2001
- "name": "end-time",
2002
- "hasDynamicHelp": false,
2003
- "multiple": false,
2004
- "type": "option"
2005
- },
2006
- "start-time": {
2007
- "description": "Schedule start (YYYY-MM-DD), defaults to today",
2008
- "name": "start-time",
2009
- "hasDynamicHelp": false,
2010
- "multiple": false,
2011
- "type": "option"
2012
- },
2013
1942
  "yes": {
2014
1943
  "char": "y",
2015
1944
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2024,35 +1953,15 @@
2024
1953
  "multiple": false,
2025
1954
  "type": "option"
2026
1955
  },
2027
- "automated-keywords": {
2028
- "description": "Let Apple add keywords automatically",
2029
- "name": "automated-keywords",
2030
- "allowNo": true,
2031
- "type": "boolean"
2032
- },
2033
- "cpa-goal": {
2034
- "description": "CPA goal (amount, e.g. 50 or 12.50)",
2035
- "name": "cpa-goal",
2036
- "hasDynamicHelp": false,
2037
- "multiple": false,
2038
- "type": "option"
2039
- },
2040
- "default-bid": {
2041
- "description": "Default bid (amount, e.g. 50 or 12.50)",
2042
- "name": "default-bid",
2043
- "hasDynamicHelp": false,
2044
- "multiple": false,
2045
- "type": "option"
2046
- },
2047
1956
  "name": {
2048
- "description": "Ad group name",
1957
+ "description": "Ad name",
2049
1958
  "name": "name",
2050
1959
  "hasDynamicHelp": false,
2051
1960
  "multiple": false,
2052
1961
  "type": "option"
2053
1962
  },
2054
1963
  "status": {
2055
- "description": "Ad group status",
1964
+ "description": "Ad status",
2056
1965
  "name": "status",
2057
1966
  "hasDynamicHelp": false,
2058
1967
  "multiple": false,
@@ -2065,7 +1974,7 @@
2065
1974
  },
2066
1975
  "hasDynamicHelp": false,
2067
1976
  "hiddenAliases": [],
2068
- "id": "asa:ad-groups:update",
1977
+ "id": "asa:ads:update",
2069
1978
  "pluginAlias": "adapty",
2070
1979
  "pluginName": "adapty",
2071
1980
  "pluginType": "core",
@@ -2076,16 +1985,17 @@
2076
1985
  "dist",
2077
1986
  "commands",
2078
1987
  "asa",
2079
- "ad-groups",
1988
+ "ads",
2080
1989
  "update.js"
2081
1990
  ]
2082
1991
  },
2083
- "asa:ads:create": {
1992
+ "asa:ad-groups:create": {
2084
1993
  "aliases": [],
2085
1994
  "args": {},
2086
- "description": "Create an ad from a creative in an ad group",
1995
+ "description": "Create an ad group inside a campaign",
2087
1996
  "examples": [
2088
- "<%= config.bin %> asa ads create --ad-group UUID --creative-id 4321 --name \"Summer ad\""
1997
+ "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20",
1998
+ "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20 --start-time 2026-09-01 --pricing-model CPM"
2089
1999
  ],
2090
2000
  "flags": {
2091
2001
  "json": {
@@ -2095,6 +2005,40 @@
2095
2005
  "allowNo": false,
2096
2006
  "type": "boolean"
2097
2007
  },
2008
+ "currency": {
2009
+ "description": "Currency code for the amounts in this call",
2010
+ "name": "currency",
2011
+ "default": "USD",
2012
+ "hasDynamicHelp": false,
2013
+ "multiple": false,
2014
+ "type": "option"
2015
+ },
2016
+ "end-time": {
2017
+ "description": "Schedule end (YYYY-MM-DD)",
2018
+ "name": "end-time",
2019
+ "hasDynamicHelp": false,
2020
+ "multiple": false,
2021
+ "type": "option"
2022
+ },
2023
+ "start-time": {
2024
+ "description": "Schedule start (YYYY-MM-DD), defaults to today",
2025
+ "name": "start-time",
2026
+ "hasDynamicHelp": false,
2027
+ "multiple": false,
2028
+ "type": "option"
2029
+ },
2030
+ "pricing-model": {
2031
+ "description": "Pricing model; Apple requires one on every ad group",
2032
+ "name": "pricing-model",
2033
+ "default": "CPC",
2034
+ "hasDynamicHelp": false,
2035
+ "multiple": false,
2036
+ "options": [
2037
+ "CPC",
2038
+ "CPM"
2039
+ ],
2040
+ "type": "option"
2041
+ },
2098
2042
  "yes": {
2099
2043
  "char": "y",
2100
2044
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2109,24 +2053,37 @@
2109
2053
  "multiple": false,
2110
2054
  "type": "option"
2111
2055
  },
2112
- "ad-group": {
2113
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
2114
- "name": "ad-group",
2056
+ "automated-keywords": {
2057
+ "description": "Let Apple add keywords automatically",
2058
+ "name": "automated-keywords",
2059
+ "allowNo": true,
2060
+ "type": "boolean"
2061
+ },
2062
+ "campaign": {
2063
+ "description": "Campaign ID (UUID)",
2064
+ "name": "campaign",
2115
2065
  "required": true,
2116
2066
  "hasDynamicHelp": false,
2117
2067
  "multiple": false,
2118
2068
  "type": "option"
2119
2069
  },
2120
- "creative-id": {
2121
- "description": "Apple creative ID from a product page or the default set",
2122
- "name": "creative-id",
2070
+ "cpa-goal": {
2071
+ "description": "CPA goal (amount, e.g. 50 or 12.50)",
2072
+ "name": "cpa-goal",
2073
+ "hasDynamicHelp": false,
2074
+ "multiple": false,
2075
+ "type": "option"
2076
+ },
2077
+ "default-bid": {
2078
+ "description": "Default bid (amount, e.g. 50 or 12.50)",
2079
+ "name": "default-bid",
2123
2080
  "required": true,
2124
2081
  "hasDynamicHelp": false,
2125
2082
  "multiple": false,
2126
2083
  "type": "option"
2127
2084
  },
2128
2085
  "name": {
2129
- "description": "Ad name",
2086
+ "description": "Ad group name",
2130
2087
  "name": "name",
2131
2088
  "required": true,
2132
2089
  "hasDynamicHelp": false,
@@ -2147,7 +2104,7 @@
2147
2104
  },
2148
2105
  "hasDynamicHelp": false,
2149
2106
  "hiddenAliases": [],
2150
- "id": "asa:ads:create",
2107
+ "id": "asa:ad-groups:create",
2151
2108
  "pluginAlias": "adapty",
2152
2109
  "pluginName": "adapty",
2153
2110
  "pluginType": "core",
@@ -2158,22 +2115,22 @@
2158
2115
  "dist",
2159
2116
  "commands",
2160
2117
  "asa",
2161
- "ads",
2118
+ "ad-groups",
2162
2119
  "create.js"
2163
2120
  ]
2164
2121
  },
2165
- "asa:ads:get": {
2122
+ "asa:ad-groups:get": {
2166
2123
  "aliases": [],
2167
2124
  "args": {
2168
- "ad_id": {
2169
- "description": "Ad ID (UUID)",
2170
- "name": "ad_id",
2125
+ "ad_group_id": {
2126
+ "description": "Ad group ID (UUID)",
2127
+ "name": "ad_group_id",
2171
2128
  "required": true
2172
2129
  }
2173
2130
  },
2174
- "description": "Show one ad and its serving state",
2131
+ "description": "Show one ad group; read numbers with asa metrics",
2175
2132
  "examples": [
2176
- "<%= config.bin %> asa ads get 550e8400-e29b-41d4-a716-446655440000"
2133
+ "<%= config.bin %> asa ad-groups get 550e8400-e29b-41d4-a716-446655440000"
2177
2134
  ],
2178
2135
  "flags": {
2179
2136
  "json": {
@@ -2186,7 +2143,7 @@
2186
2143
  },
2187
2144
  "hasDynamicHelp": false,
2188
2145
  "hiddenAliases": [],
2189
- "id": "asa:ads:get",
2146
+ "id": "asa:ad-groups:get",
2190
2147
  "pluginAlias": "adapty",
2191
2148
  "pluginName": "adapty",
2192
2149
  "pluginType": "core",
@@ -2197,17 +2154,17 @@
2197
2154
  "dist",
2198
2155
  "commands",
2199
2156
  "asa",
2200
- "ads",
2157
+ "ad-groups",
2201
2158
  "get.js"
2202
2159
  ]
2203
2160
  },
2204
- "asa:ads:list": {
2161
+ "asa:ad-groups:list": {
2205
2162
  "aliases": [],
2206
2163
  "args": {},
2207
- "description": "List ads; serving_state_reasons explains why an enabled ad is not running",
2164
+ "description": "List ad groups; read numbers with asa metrics",
2208
2165
  "examples": [
2209
- "<%= config.bin %> asa ads list",
2210
- "<%= config.bin %> asa ads list --ad-group AD_GROUP_UUID --status ENABLED"
2166
+ "<%= config.bin %> asa ad-groups list",
2167
+ "<%= config.bin %> asa ad-groups list --campaign CAMPAIGN_UUID"
2211
2168
  ],
2212
2169
  "flags": {
2213
2170
  "json": {
@@ -2233,16 +2190,9 @@
2233
2190
  "multiple": false,
2234
2191
  "type": "option"
2235
2192
  },
2236
- "ad-group": {
2237
- "description": "Keep only rows in this ad group; repeatable",
2238
- "name": "ad-group",
2239
- "hasDynamicHelp": false,
2240
- "multiple": true,
2241
- "type": "option"
2242
- },
2243
- "campaign": {
2244
- "description": "Keep only rows in this campaign; repeatable",
2245
- "name": "campaign",
2193
+ "app": {
2194
+ "description": "Keep only rows in this app; repeatable",
2195
+ "name": "app",
2246
2196
  "hasDynamicHelp": false,
2247
2197
  "multiple": true,
2248
2198
  "type": "option"
@@ -2261,6 +2211,13 @@
2261
2211
  "multiple": false,
2262
2212
  "type": "option"
2263
2213
  },
2214
+ "campaign": {
2215
+ "description": "Keep only rows in this campaign; repeatable",
2216
+ "name": "campaign",
2217
+ "hasDynamicHelp": false,
2218
+ "multiple": true,
2219
+ "type": "option"
2220
+ },
2264
2221
  "status": {
2265
2222
  "description": "Keep only rows in this state",
2266
2223
  "name": "status",
@@ -2275,7 +2232,7 @@
2275
2232
  },
2276
2233
  "hasDynamicHelp": false,
2277
2234
  "hiddenAliases": [],
2278
- "id": "asa:ads:list",
2235
+ "id": "asa:ad-groups:list",
2279
2236
  "pluginAlias": "adapty",
2280
2237
  "pluginName": "adapty",
2281
2238
  "pluginType": "core",
@@ -2286,22 +2243,23 @@
2286
2243
  "dist",
2287
2244
  "commands",
2288
2245
  "asa",
2289
- "ads",
2246
+ "ad-groups",
2290
2247
  "list.js"
2291
2248
  ]
2292
2249
  },
2293
- "asa:ads:update": {
2250
+ "asa:ad-groups:update": {
2294
2251
  "aliases": [],
2295
2252
  "args": {
2296
- "ad_id": {
2297
- "description": "Ad ID (UUID)",
2298
- "name": "ad_id",
2253
+ "ad_group_id": {
2254
+ "description": "Ad group ID (UUID)",
2255
+ "name": "ad_group_id",
2299
2256
  "required": true
2300
2257
  }
2301
2258
  },
2302
- "description": "Rename an ad or pause it; the creative and ad group are fixed at creation",
2259
+ "description": "Change an ad group: bid, CPA goal, status or schedule",
2303
2260
  "examples": [
2304
- "<%= config.bin %> asa ads update UUID --status PAUSED"
2261
+ "<%= config.bin %> asa ad-groups update UUID --default-bid 1.50",
2262
+ "<%= config.bin %> asa ad-groups update UUID --status PAUSED"
2305
2263
  ],
2306
2264
  "flags": {
2307
2265
  "json": {
@@ -2311,6 +2269,28 @@
2311
2269
  "allowNo": false,
2312
2270
  "type": "boolean"
2313
2271
  },
2272
+ "currency": {
2273
+ "description": "Currency code for the amounts in this call",
2274
+ "name": "currency",
2275
+ "default": "USD",
2276
+ "hasDynamicHelp": false,
2277
+ "multiple": false,
2278
+ "type": "option"
2279
+ },
2280
+ "end-time": {
2281
+ "description": "Schedule end (YYYY-MM-DD)",
2282
+ "name": "end-time",
2283
+ "hasDynamicHelp": false,
2284
+ "multiple": false,
2285
+ "type": "option"
2286
+ },
2287
+ "start-time": {
2288
+ "description": "Schedule start (YYYY-MM-DD), defaults to today",
2289
+ "name": "start-time",
2290
+ "hasDynamicHelp": false,
2291
+ "multiple": false,
2292
+ "type": "option"
2293
+ },
2314
2294
  "yes": {
2315
2295
  "char": "y",
2316
2296
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2325,15 +2305,35 @@
2325
2305
  "multiple": false,
2326
2306
  "type": "option"
2327
2307
  },
2308
+ "automated-keywords": {
2309
+ "description": "Let Apple add keywords automatically",
2310
+ "name": "automated-keywords",
2311
+ "allowNo": true,
2312
+ "type": "boolean"
2313
+ },
2314
+ "cpa-goal": {
2315
+ "description": "CPA goal (amount, e.g. 50 or 12.50)",
2316
+ "name": "cpa-goal",
2317
+ "hasDynamicHelp": false,
2318
+ "multiple": false,
2319
+ "type": "option"
2320
+ },
2321
+ "default-bid": {
2322
+ "description": "Default bid (amount, e.g. 50 or 12.50)",
2323
+ "name": "default-bid",
2324
+ "hasDynamicHelp": false,
2325
+ "multiple": false,
2326
+ "type": "option"
2327
+ },
2328
2328
  "name": {
2329
- "description": "Ad name",
2329
+ "description": "Ad group name",
2330
2330
  "name": "name",
2331
2331
  "hasDynamicHelp": false,
2332
2332
  "multiple": false,
2333
2333
  "type": "option"
2334
2334
  },
2335
2335
  "status": {
2336
- "description": "Ad status",
2336
+ "description": "Ad group status",
2337
2337
  "name": "status",
2338
2338
  "hasDynamicHelp": false,
2339
2339
  "multiple": false,
@@ -2346,7 +2346,7 @@
2346
2346
  },
2347
2347
  "hasDynamicHelp": false,
2348
2348
  "hiddenAliases": [],
2349
- "id": "asa:ads:update",
2349
+ "id": "asa:ad-groups:update",
2350
2350
  "pluginAlias": "adapty",
2351
2351
  "pluginName": "adapty",
2352
2352
  "pluginType": "core",
@@ -2357,7 +2357,7 @@
2357
2357
  "dist",
2358
2358
  "commands",
2359
2359
  "asa",
2360
- "ads",
2360
+ "ad-groups",
2361
2361
  "update.js"
2362
2362
  ]
2363
2363
  },
@@ -2411,15 +2411,13 @@
2411
2411
  "list.js"
2412
2412
  ]
2413
2413
  },
2414
- "asa:campaigns:bulk-create": {
2414
+ "asa:automations:create": {
2415
2415
  "aliases": [],
2416
2416
  "args": {},
2417
- "description": "Create a whole campaign structure (campaigns → ad groups → keywords/negative keywords/ads) in one bulk operation",
2417
+ "description": "Create an automation rule from a JSON rule file",
2418
2418
  "examples": [
2419
- "<%= config.bin %> asa campaigns bulk-create --file structure.json",
2420
- "cat structure.json | <%= config.bin %> asa campaigns bulk-create --file -",
2421
- "<%= config.bin %> asa campaigns bulk-create --from-file Campaign_And_Adgroup_Template.xlsx --org-id 1234567",
2422
- "<%= config.bin %> asa campaigns bulk-create --from-file keywords_template.csv --org-id 1234567 --preview"
2419
+ "<%= config.bin %> asa automations create --file rule.json",
2420
+ "<%= config.bin %> asa automations create --file rule.json --run-now"
2423
2421
  ],
2424
2422
  "flags": {
2425
2423
  "json": {
@@ -2444,58 +2442,23 @@
2444
2442
  "type": "option"
2445
2443
  },
2446
2444
  "file": {
2447
- "description": "JSON file with the campaign structure (the POST /bulk-operations/ body); use \"-\" for stdin",
2445
+ "description": "JSON file with the rule body, or - to read stdin",
2448
2446
  "name": "file",
2447
+ "required": true,
2449
2448
  "hasDynamicHelp": false,
2450
2449
  "multiple": false,
2451
2450
  "type": "option"
2452
2451
  },
2453
- "from-file": {
2454
- "description": "Apple Ads bulk template (Campaign_And_Adgroup_Template.xlsx or keywords .csv) to convert and submit",
2455
- "name": "from-file",
2456
- "hasDynamicHelp": false,
2457
- "multiple": false,
2458
- "type": "option"
2459
- },
2460
- "org-id": {
2461
- "description": "Apple org id (campaign_group_id) the converted template will target; required with --from-file",
2462
- "name": "org-id",
2463
- "hasDynamicHelp": false,
2464
- "multiple": false,
2465
- "type": "option"
2466
- },
2467
- "poll-interval": {
2468
- "description": "Seconds between progress polls",
2469
- "name": "poll-interval",
2470
- "default": 5,
2471
- "hasDynamicHelp": false,
2472
- "multiple": false,
2473
- "type": "option"
2474
- },
2475
- "preview": {
2476
- "description": "With --from-file: print the converted request and stop, nothing is created",
2477
- "name": "preview",
2452
+ "run-now": {
2453
+ "description": "Queue the first run right after the rule is stored",
2454
+ "name": "run-now",
2478
2455
  "allowNo": false,
2479
2456
  "type": "boolean"
2480
- },
2481
- "timeout": {
2482
- "description": "Max seconds to wait for the operation to finish",
2483
- "name": "timeout",
2484
- "default": 900,
2485
- "hasDynamicHelp": false,
2486
- "multiple": false,
2487
- "type": "option"
2488
- },
2489
- "wait": {
2490
- "description": "Poll the operation until it finishes; --no-wait returns the operation id immediately",
2491
- "name": "wait",
2492
- "allowNo": true,
2493
- "type": "boolean"
2494
2457
  }
2495
2458
  },
2496
2459
  "hasDynamicHelp": false,
2497
2460
  "hiddenAliases": [],
2498
- "id": "asa:campaigns:bulk-create",
2461
+ "id": "asa:automations:create",
2499
2462
  "pluginAlias": "adapty",
2500
2463
  "pluginName": "adapty",
2501
2464
  "pluginType": "core",
@@ -2506,18 +2469,22 @@
2506
2469
  "dist",
2507
2470
  "commands",
2508
2471
  "asa",
2509
- "campaigns",
2510
- "bulk-create.js"
2472
+ "automations",
2473
+ "create.js"
2511
2474
  ]
2512
2475
  },
2513
- "asa:campaigns:bulk-list": {
2476
+ "asa:automations:get": {
2514
2477
  "aliases": [],
2515
- "args": {},
2516
- "description": "This company's bulk operations, newest first; inspect one with bulk-status",
2478
+ "args": {
2479
+ "automation_id": {
2480
+ "description": "Automation rule ID (UUID)",
2481
+ "name": "automation_id",
2482
+ "required": true
2483
+ }
2484
+ },
2485
+ "description": "Show one automation rule with its conditions and actions",
2517
2486
  "examples": [
2518
- "<%= config.bin %> asa campaigns bulk-list",
2519
- "<%= config.bin %> asa campaigns bulk-list --status partial --status failed",
2520
- "<%= config.bin %> asa campaigns bulk-list --created-from 2026-08-01 --created-to 2026-08-20"
2487
+ "<%= config.bin %> asa automations get 550e8400-e29b-41d4-a716-446655440000"
2521
2488
  ],
2522
2489
  "flags": {
2523
2490
  "json": {
@@ -2526,62 +2493,11 @@
2526
2493
  "name": "json",
2527
2494
  "allowNo": false,
2528
2495
  "type": "boolean"
2529
- },
2530
- "page": {
2531
- "description": "Page number",
2532
- "name": "page",
2533
- "default": 1,
2534
- "hasDynamicHelp": false,
2535
- "multiple": false,
2536
- "type": "option"
2537
- },
2538
- "page-size": {
2539
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2540
- "name": "page-size",
2541
- "default": 100,
2542
- "hasDynamicHelp": false,
2543
- "multiple": false,
2544
- "type": "option"
2545
- },
2546
- "app": {
2547
- "description": "Keep only operations of this app (UUID)",
2548
- "name": "app",
2549
- "hasDynamicHelp": false,
2550
- "multiple": false,
2551
- "type": "option"
2552
- },
2553
- "created-from": {
2554
- "description": "Keep only operations created on or after this date (YYYY-MM-DD)",
2555
- "name": "created-from",
2556
- "hasDynamicHelp": false,
2557
- "multiple": false,
2558
- "type": "option"
2559
- },
2560
- "created-to": {
2561
- "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
2562
- "name": "created-to",
2563
- "hasDynamicHelp": false,
2564
- "multiple": false,
2565
- "type": "option"
2566
- },
2567
- "status": {
2568
- "description": "Keep only operations in this state; repeatable",
2569
- "name": "status",
2570
- "hasDynamicHelp": false,
2571
- "multiple": true,
2572
- "options": [
2573
- "failed",
2574
- "partial",
2575
- "pending",
2576
- "running",
2577
- "success"
2578
- ],
2579
- "type": "option"
2580
2496
  }
2581
2497
  },
2582
2498
  "hasDynamicHelp": false,
2583
2499
  "hiddenAliases": [],
2584
- "id": "asa:campaigns:bulk-list",
2500
+ "id": "asa:automations:get",
2585
2501
  "pluginAlias": "adapty",
2586
2502
  "pluginName": "adapty",
2587
2503
  "pluginType": "core",
@@ -2592,22 +2508,16 @@
2592
2508
  "dist",
2593
2509
  "commands",
2594
2510
  "asa",
2595
- "campaigns",
2596
- "bulk-list.js"
2511
+ "automations",
2512
+ "get.js"
2597
2513
  ]
2598
2514
  },
2599
- "asa:campaigns:bulk-status": {
2515
+ "asa:automations:list": {
2600
2516
  "aliases": [],
2601
- "args": {
2602
- "operation-id": {
2603
- "description": "Bulk operation ID returned by bulk-create",
2604
- "name": "operation-id",
2605
- "required": true
2606
- }
2607
- },
2608
- "description": "Progress board of one bulk operation: counts, pipelines and the per-object log",
2517
+ "args": {},
2518
+ "description": "List automation rules; status 1 is active, 0 is stopped",
2609
2519
  "examples": [
2610
- "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
2520
+ "<%= config.bin %> asa automations list"
2611
2521
  ],
2612
2522
  "flags": {
2613
2523
  "json": {
@@ -2636,7 +2546,7 @@
2636
2546
  },
2637
2547
  "hasDynamicHelp": false,
2638
2548
  "hiddenAliases": [],
2639
- "id": "asa:campaigns:bulk-status",
2549
+ "id": "asa:automations:list",
2640
2550
  "pluginAlias": "adapty",
2641
2551
  "pluginName": "adapty",
2642
2552
  "pluginType": "core",
@@ -2647,16 +2557,23 @@
2647
2557
  "dist",
2648
2558
  "commands",
2649
2559
  "asa",
2650
- "campaigns",
2651
- "bulk-status.js"
2560
+ "automations",
2561
+ "list.js"
2652
2562
  ]
2653
2563
  },
2654
- "asa:campaigns:create": {
2564
+ "asa:automations:run": {
2655
2565
  "aliases": [],
2656
- "args": {},
2657
- "description": "Create a campaign in Apple Search Ads",
2566
+ "args": {
2567
+ "automation_id": {
2568
+ "description": "Automation rule ID (UUID)",
2569
+ "name": "automation_id",
2570
+ "required": true
2571
+ }
2572
+ },
2573
+ "description": "Run an automation rule now; the run is queued, not awaited",
2658
2574
  "examples": [
2659
- "<%= config.bin %> asa campaigns create --org UUID --name \"Winter push\" --adam-id 123456 --country US --daily-budget 50"
2575
+ "<%= config.bin %> asa automations run UUID",
2576
+ "<%= config.bin %> asa automations run UUID --dry-run"
2660
2577
  ],
2661
2578
  "flags": {
2662
2579
  "json": {
@@ -2666,14 +2583,6 @@
2666
2583
  "allowNo": false,
2667
2584
  "type": "boolean"
2668
2585
  },
2669
- "currency": {
2670
- "description": "Currency code for the amounts in this call",
2671
- "name": "currency",
2672
- "default": "USD",
2673
- "hasDynamicHelp": false,
2674
- "multiple": false,
2675
- "type": "option"
2676
- },
2677
2586
  "yes": {
2678
2587
  "char": "y",
2679
2588
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2688,120 +2597,16 @@
2688
2597
  "multiple": false,
2689
2598
  "type": "option"
2690
2599
  },
2691
- "ad-channel-type": {
2692
- "description": "Ad channel type",
2693
- "name": "ad-channel-type",
2694
- "default": "SEARCH",
2695
- "hasDynamicHelp": false,
2696
- "multiple": false,
2697
- "options": [
2698
- "DISPLAY",
2699
- "SEARCH"
2700
- ],
2701
- "type": "option"
2702
- },
2703
- "adam-id": {
2704
- "description": "App Store app ID (adam_id)",
2705
- "name": "adam-id",
2706
- "required": true,
2707
- "hasDynamicHelp": false,
2708
- "multiple": false,
2709
- "type": "option"
2710
- },
2711
- "bidding-strategy": {
2712
- "description": "Bidding strategy; Apple defaults to MANUAL_CPT when omitted",
2713
- "name": "bidding-strategy",
2714
- "hasDynamicHelp": false,
2715
- "multiple": false,
2716
- "options": [
2717
- "MANUAL_CPT",
2718
- "MAX_CONVERSIONS"
2719
- ],
2720
- "type": "option"
2721
- },
2722
- "billing-event": {
2723
- "description": "Billing event",
2724
- "name": "billing-event",
2725
- "default": "TAPS",
2726
- "hasDynamicHelp": false,
2727
- "multiple": false,
2728
- "options": [
2729
- "IMPRESSIONS",
2730
- "TAPS"
2731
- ],
2732
- "type": "option"
2733
- },
2734
- "budget": {
2735
- "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
2736
- "name": "budget",
2737
- "hasDynamicHelp": false,
2738
- "multiple": false,
2739
- "type": "option"
2740
- },
2741
- "country": {
2742
- "description": "Country or region code, repeatable",
2743
- "name": "country",
2744
- "required": true,
2745
- "hasDynamicHelp": false,
2746
- "multiple": true,
2747
- "type": "option"
2748
- },
2749
- "daily-budget": {
2750
- "description": "Daily budget (amount, e.g. 50 or 12.50)",
2751
- "name": "daily-budget",
2752
- "required": true,
2753
- "hasDynamicHelp": false,
2754
- "multiple": false,
2755
- "type": "option"
2756
- },
2757
- "name": {
2758
- "description": "Campaign name",
2759
- "name": "name",
2760
- "required": true,
2761
- "hasDynamicHelp": false,
2762
- "multiple": false,
2763
- "type": "option"
2764
- },
2765
- "org": {
2766
- "description": "Campaign group ID (UUID) — see `adapty asa orgs list`",
2767
- "name": "org",
2768
- "required": true,
2769
- "hasDynamicHelp": false,
2770
- "multiple": false,
2771
- "type": "option"
2772
- },
2773
- "status": {
2774
- "description": "Initial status",
2775
- "name": "status",
2776
- "hasDynamicHelp": false,
2777
- "multiple": false,
2778
- "options": [
2779
- "ENABLED",
2780
- "PAUSED"
2781
- ],
2782
- "type": "option"
2783
- },
2784
- "supply-source": {
2785
- "description": "Supply source, repeatable",
2786
- "name": "supply-source",
2787
- "default": [
2788
- "APPSTORE_SEARCH_RESULTS"
2789
- ],
2790
- "hasDynamicHelp": false,
2791
- "multiple": true,
2792
- "type": "option"
2793
- },
2794
- "target-cpa": {
2795
- "description": "Target CPA (amount, e.g. 50 or 12.50)",
2796
- "name": "target-cpa",
2797
- "hasDynamicHelp": false,
2798
- "multiple": false,
2799
- "type": "option"
2600
+ "dry-run": {
2601
+ "description": "Evaluate and log the rule without touching Apple",
2602
+ "name": "dry-run",
2603
+ "allowNo": false,
2604
+ "type": "boolean"
2800
2605
  }
2801
2606
  },
2802
2607
  "hasDynamicHelp": false,
2803
2608
  "hiddenAliases": [],
2804
- "id": "asa:campaigns:create",
2609
+ "id": "asa:automations:run",
2805
2610
  "pluginAlias": "adapty",
2806
2611
  "pluginName": "adapty",
2807
2612
  "pluginType": "core",
@@ -2812,22 +2617,22 @@
2812
2617
  "dist",
2813
2618
  "commands",
2814
2619
  "asa",
2815
- "campaigns",
2816
- "create.js"
2620
+ "automations",
2621
+ "run.js"
2817
2622
  ]
2818
2623
  },
2819
- "asa:campaigns:get": {
2624
+ "asa:automations:runs": {
2820
2625
  "aliases": [],
2821
2626
  "args": {
2822
- "campaign_id": {
2823
- "description": "Campaign ID (UUID)",
2824
- "name": "campaign_id",
2627
+ "automation_id": {
2628
+ "description": "Automation rule ID (UUID)",
2629
+ "name": "automation_id",
2825
2630
  "required": true
2826
2631
  }
2827
2632
  },
2828
- "description": "Show one campaign; read numbers with asa metrics",
2633
+ "description": "List past runs of an automation rule, including dry runs",
2829
2634
  "examples": [
2830
- "<%= config.bin %> asa campaigns get 550e8400-e29b-41d4-a716-446655440000"
2635
+ "<%= config.bin %> asa automations runs 550e8400-e29b-41d4-a716-446655440000"
2831
2636
  ],
2832
2637
  "flags": {
2833
2638
  "json": {
@@ -2836,11 +2641,27 @@
2836
2641
  "name": "json",
2837
2642
  "allowNo": false,
2838
2643
  "type": "boolean"
2644
+ },
2645
+ "page": {
2646
+ "description": "Page number",
2647
+ "name": "page",
2648
+ "default": 1,
2649
+ "hasDynamicHelp": false,
2650
+ "multiple": false,
2651
+ "type": "option"
2652
+ },
2653
+ "page-size": {
2654
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2655
+ "name": "page-size",
2656
+ "default": 100,
2657
+ "hasDynamicHelp": false,
2658
+ "multiple": false,
2659
+ "type": "option"
2839
2660
  }
2840
2661
  },
2841
2662
  "hasDynamicHelp": false,
2842
2663
  "hiddenAliases": [],
2843
- "id": "asa:campaigns:get",
2664
+ "id": "asa:automations:runs",
2844
2665
  "pluginAlias": "adapty",
2845
2666
  "pluginName": "adapty",
2846
2667
  "pluginType": "core",
@@ -2851,17 +2672,23 @@
2851
2672
  "dist",
2852
2673
  "commands",
2853
2674
  "asa",
2854
- "campaigns",
2855
- "get.js"
2675
+ "automations",
2676
+ "runs.js"
2856
2677
  ]
2857
2678
  },
2858
- "asa:campaigns:list": {
2679
+ "asa:automations:update": {
2859
2680
  "aliases": [],
2860
- "args": {},
2861
- "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
2681
+ "args": {
2682
+ "automation_id": {
2683
+ "description": "Automation rule ID (UUID)",
2684
+ "name": "automation_id",
2685
+ "required": true
2686
+ }
2687
+ },
2688
+ "description": "Change an automation rule: stop it, rename it, or replace parts of the rule",
2862
2689
  "examples": [
2863
- "<%= config.bin %> asa campaigns list",
2864
- "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
2690
+ "<%= config.bin %> asa automations update UUID --stop",
2691
+ "<%= config.bin %> asa automations update UUID --file rule.json"
2865
2692
  ],
2866
2693
  "flags": {
2867
2694
  "json": {
@@ -2871,58 +2698,56 @@
2871
2698
  "allowNo": false,
2872
2699
  "type": "boolean"
2873
2700
  },
2874
- "page": {
2875
- "description": "Page number",
2876
- "name": "page",
2877
- "default": 1,
2878
- "hasDynamicHelp": false,
2879
- "multiple": false,
2880
- "type": "option"
2701
+ "yes": {
2702
+ "char": "y",
2703
+ "description": "Apply without asking; required when the output is piped or --json is used",
2704
+ "name": "yes",
2705
+ "allowNo": false,
2706
+ "type": "boolean"
2881
2707
  },
2882
- "page-size": {
2883
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2884
- "name": "page-size",
2885
- "default": 100,
2708
+ "idempotency-key": {
2709
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2710
+ "name": "idempotency-key",
2886
2711
  "hasDynamicHelp": false,
2887
2712
  "multiple": false,
2888
2713
  "type": "option"
2889
2714
  },
2890
- "app": {
2891
- "description": "Keep only rows in this app; repeatable",
2892
- "name": "app",
2893
- "hasDynamicHelp": false,
2894
- "multiple": true,
2895
- "type": "option"
2896
- },
2897
- "campaign-group": {
2898
- "description": "Keep only rows in this campaign group; repeatable",
2899
- "name": "campaign-group",
2715
+ "file": {
2716
+ "description": "JSON file with the parts to change, or - to read stdin",
2717
+ "name": "file",
2900
2718
  "hasDynamicHelp": false,
2901
- "multiple": true,
2719
+ "multiple": false,
2902
2720
  "type": "option"
2903
2721
  },
2904
- "search": {
2905
- "description": "Case-insensitive substring match on the name",
2906
- "name": "search",
2722
+ "name": {
2723
+ "description": "Rule name",
2724
+ "name": "name",
2907
2725
  "hasDynamicHelp": false,
2908
2726
  "multiple": false,
2909
2727
  "type": "option"
2910
2728
  },
2911
- "status": {
2912
- "description": "Keep only rows in this state",
2913
- "name": "status",
2914
- "hasDynamicHelp": false,
2915
- "multiple": false,
2916
- "options": [
2917
- "ENABLED",
2918
- "PAUSED"
2729
+ "start": {
2730
+ "description": "Activate the rule",
2731
+ "exclusive": [
2732
+ "stop"
2919
2733
  ],
2920
- "type": "option"
2734
+ "name": "start",
2735
+ "allowNo": false,
2736
+ "type": "boolean"
2737
+ },
2738
+ "stop": {
2739
+ "description": "Stop the rule and clear its next run",
2740
+ "exclusive": [
2741
+ "start"
2742
+ ],
2743
+ "name": "stop",
2744
+ "allowNo": false,
2745
+ "type": "boolean"
2921
2746
  }
2922
2747
  },
2923
2748
  "hasDynamicHelp": false,
2924
2749
  "hiddenAliases": [],
2925
- "id": "asa:campaigns:list",
2750
+ "id": "asa:automations:update",
2926
2751
  "pluginAlias": "adapty",
2927
2752
  "pluginName": "adapty",
2928
2753
  "pluginType": "core",
@@ -2933,23 +2758,19 @@
2933
2758
  "dist",
2934
2759
  "commands",
2935
2760
  "asa",
2936
- "campaigns",
2937
- "list.js"
2761
+ "automations",
2762
+ "update.js"
2938
2763
  ]
2939
2764
  },
2940
- "asa:campaigns:update": {
2765
+ "asa:campaigns:bulk-create": {
2941
2766
  "aliases": [],
2942
- "args": {
2943
- "campaign_id": {
2944
- "description": "Campaign ID (UUID)",
2945
- "name": "campaign_id",
2946
- "required": true
2947
- }
2948
- },
2949
- "description": "Change a campaign: budgets, countries, status or schedule",
2767
+ "args": {},
2768
+ "description": "Create a whole campaign structure (campaigns → ad groups → keywords/negative keywords/ads) in one bulk operation",
2950
2769
  "examples": [
2951
- "<%= config.bin %> asa campaigns update UUID --status PAUSED",
2952
- "<%= config.bin %> asa campaigns update UUID --daily-budget 80"
2770
+ "<%= config.bin %> asa campaigns bulk-create --file structure.json",
2771
+ "cat structure.json | <%= config.bin %> asa campaigns bulk-create --file -",
2772
+ "<%= config.bin %> asa campaigns bulk-create --from-file Campaign_And_Adgroup_Template.xlsx --org-id 1234567",
2773
+ "<%= config.bin %> asa campaigns bulk-create --from-file keywords_template.csv --org-id 1234567 --preview"
2953
2774
  ],
2954
2775
  "flags": {
2955
2776
  "json": {
@@ -2959,14 +2780,6 @@
2959
2780
  "allowNo": false,
2960
2781
  "type": "boolean"
2961
2782
  },
2962
- "currency": {
2963
- "description": "Currency code for the amounts in this call",
2964
- "name": "currency",
2965
- "default": "USD",
2966
- "hasDynamicHelp": false,
2967
- "multiple": false,
2968
- "type": "option"
2969
- },
2970
2783
  "yes": {
2971
2784
  "char": "y",
2972
2785
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2981,67 +2794,59 @@
2981
2794
  "multiple": false,
2982
2795
  "type": "option"
2983
2796
  },
2984
- "bidding-strategy": {
2985
- "description": "Bidding strategy",
2986
- "name": "bidding-strategy",
2797
+ "file": {
2798
+ "description": "JSON file with the campaign structure (the POST /bulk-operations/ body); use \"-\" for stdin",
2799
+ "name": "file",
2987
2800
  "hasDynamicHelp": false,
2988
2801
  "multiple": false,
2989
- "options": [
2990
- "MANUAL_CPT",
2991
- "MAX_CONVERSIONS"
2992
- ],
2993
2802
  "type": "option"
2994
2803
  },
2995
- "budget": {
2996
- "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
2997
- "name": "budget",
2804
+ "from-file": {
2805
+ "description": "Apple Ads bulk template (Campaign_And_Adgroup_Template.xlsx or keywords .csv) to convert and submit",
2806
+ "name": "from-file",
2998
2807
  "hasDynamicHelp": false,
2999
2808
  "multiple": false,
3000
2809
  "type": "option"
3001
2810
  },
3002
- "country": {
3003
- "description": "Replace the country list, repeatable",
3004
- "name": "country",
3005
- "hasDynamicHelp": false,
3006
- "multiple": true,
3007
- "type": "option"
3008
- },
3009
- "daily-budget": {
3010
- "description": "Daily budget (amount, e.g. 50 or 12.50)",
3011
- "name": "daily-budget",
2811
+ "org-id": {
2812
+ "description": "Apple org id (campaign_group_id) the converted template will target; required with --from-file",
2813
+ "name": "org-id",
3012
2814
  "hasDynamicHelp": false,
3013
2815
  "multiple": false,
3014
2816
  "type": "option"
3015
2817
  },
3016
- "name": {
3017
- "description": "Campaign name",
3018
- "name": "name",
2818
+ "poll-interval": {
2819
+ "description": "Seconds between progress polls",
2820
+ "name": "poll-interval",
2821
+ "default": 5,
3019
2822
  "hasDynamicHelp": false,
3020
2823
  "multiple": false,
3021
2824
  "type": "option"
3022
2825
  },
3023
- "status": {
3024
- "description": "Campaign status",
3025
- "name": "status",
3026
- "hasDynamicHelp": false,
3027
- "multiple": false,
3028
- "options": [
3029
- "ENABLED",
3030
- "PAUSED"
3031
- ],
3032
- "type": "option"
2826
+ "preview": {
2827
+ "description": "With --from-file: print the converted request and stop, nothing is created",
2828
+ "name": "preview",
2829
+ "allowNo": false,
2830
+ "type": "boolean"
3033
2831
  },
3034
- "target-cpa": {
3035
- "description": "Target CPA (amount, e.g. 50 or 12.50)",
3036
- "name": "target-cpa",
2832
+ "timeout": {
2833
+ "description": "Max seconds to wait for the operation to finish",
2834
+ "name": "timeout",
2835
+ "default": 900,
3037
2836
  "hasDynamicHelp": false,
3038
2837
  "multiple": false,
3039
2838
  "type": "option"
2839
+ },
2840
+ "wait": {
2841
+ "description": "Poll the operation until it finishes; --no-wait returns the operation id immediately",
2842
+ "name": "wait",
2843
+ "allowNo": true,
2844
+ "type": "boolean"
3040
2845
  }
3041
2846
  },
3042
2847
  "hasDynamicHelp": false,
3043
2848
  "hiddenAliases": [],
3044
- "id": "asa:campaigns:update",
2849
+ "id": "asa:campaigns:bulk-create",
3045
2850
  "pluginAlias": "adapty",
3046
2851
  "pluginName": "adapty",
3047
2852
  "pluginType": "core",
@@ -3053,16 +2858,17 @@
3053
2858
  "commands",
3054
2859
  "asa",
3055
2860
  "campaigns",
3056
- "update.js"
2861
+ "bulk-create.js"
3057
2862
  ]
3058
2863
  },
3059
- "asa:creatives:list": {
2864
+ "asa:campaigns:bulk-list": {
3060
2865
  "aliases": [],
3061
2866
  "args": {},
3062
- "description": "List creatives; creative_id is what `asa ads create` needs",
2867
+ "description": "This company's bulk operations, newest first; inspect one with bulk-status",
3063
2868
  "examples": [
3064
- "<%= config.bin %> asa creatives list",
3065
- "<%= config.bin %> asa creatives list --app APP_UUID"
2869
+ "<%= config.bin %> asa campaigns bulk-list",
2870
+ "<%= config.bin %> asa campaigns bulk-list --status partial --status failed",
2871
+ "<%= config.bin %> asa campaigns bulk-list --created-from 2026-08-01 --created-to 2026-08-20"
3066
2872
  ],
3067
2873
  "flags": {
3068
2874
  "json": {
@@ -3089,23 +2895,44 @@
3089
2895
  "type": "option"
3090
2896
  },
3091
2897
  "app": {
3092
- "description": "Keep only rows in this app; repeatable",
2898
+ "description": "Keep only operations of this app (UUID)",
3093
2899
  "name": "app",
3094
2900
  "hasDynamicHelp": false,
3095
- "multiple": true,
2901
+ "multiple": false,
3096
2902
  "type": "option"
3097
2903
  },
3098
- "campaign-group": {
3099
- "description": "Keep only rows in this campaign group; repeatable",
3100
- "name": "campaign-group",
2904
+ "created-from": {
2905
+ "description": "Keep only operations created on or after this date (YYYY-MM-DD)",
2906
+ "name": "created-from",
2907
+ "hasDynamicHelp": false,
2908
+ "multiple": false,
2909
+ "type": "option"
2910
+ },
2911
+ "created-to": {
2912
+ "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
2913
+ "name": "created-to",
2914
+ "hasDynamicHelp": false,
2915
+ "multiple": false,
2916
+ "type": "option"
2917
+ },
2918
+ "status": {
2919
+ "description": "Keep only operations in this state; repeatable",
2920
+ "name": "status",
3101
2921
  "hasDynamicHelp": false,
3102
2922
  "multiple": true,
2923
+ "options": [
2924
+ "failed",
2925
+ "partial",
2926
+ "pending",
2927
+ "running",
2928
+ "success"
2929
+ ],
3103
2930
  "type": "option"
3104
2931
  }
3105
2932
  },
3106
2933
  "hasDynamicHelp": false,
3107
2934
  "hiddenAliases": [],
3108
- "id": "asa:creatives:list",
2935
+ "id": "asa:campaigns:bulk-list",
3109
2936
  "pluginAlias": "adapty",
3110
2937
  "pluginName": "adapty",
3111
2938
  "pluginType": "core",
@@ -3116,16 +2943,22 @@
3116
2943
  "dist",
3117
2944
  "commands",
3118
2945
  "asa",
3119
- "creatives",
3120
- "list.js"
2946
+ "campaigns",
2947
+ "bulk-list.js"
3121
2948
  ]
3122
2949
  },
3123
- "asa:competitors:summary": {
2950
+ "asa:campaigns:bulk-status": {
3124
2951
  "aliases": [],
3125
- "args": {},
3126
- "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
2952
+ "args": {
2953
+ "operation-id": {
2954
+ "description": "Bulk operation ID returned by bulk-create",
2955
+ "name": "operation-id",
2956
+ "required": true
2957
+ }
2958
+ },
2959
+ "description": "Progress board of one bulk operation: counts, pipelines and the per-object log",
3127
2960
  "examples": [
3128
- "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
2961
+ "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
3129
2962
  ],
3130
2963
  "flags": {
3131
2964
  "json": {
@@ -3135,10 +2968,18 @@
3135
2968
  "allowNo": false,
3136
2969
  "type": "boolean"
3137
2970
  },
3138
- "app-ids": {
3139
- "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
3140
- "name": "app-ids",
3141
- "required": true,
2971
+ "page": {
2972
+ "description": "Page number",
2973
+ "name": "page",
2974
+ "default": 1,
2975
+ "hasDynamicHelp": false,
2976
+ "multiple": false,
2977
+ "type": "option"
2978
+ },
2979
+ "page-size": {
2980
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
2981
+ "name": "page-size",
2982
+ "default": 100,
3142
2983
  "hasDynamicHelp": false,
3143
2984
  "multiple": false,
3144
2985
  "type": "option"
@@ -3146,7 +2987,7 @@
3146
2987
  },
3147
2988
  "hasDynamicHelp": false,
3148
2989
  "hiddenAliases": [],
3149
- "id": "asa:competitors:summary",
2990
+ "id": "asa:campaigns:bulk-status",
3150
2991
  "pluginAlias": "adapty",
3151
2992
  "pluginName": "adapty",
3152
2993
  "pluginType": "core",
@@ -3157,17 +2998,16 @@
3157
2998
  "dist",
3158
2999
  "commands",
3159
3000
  "asa",
3160
- "competitors",
3161
- "summary.js"
3001
+ "campaigns",
3002
+ "bulk-status.js"
3162
3003
  ]
3163
3004
  },
3164
- "asa:keywords:add": {
3005
+ "asa:campaigns:create": {
3165
3006
  "aliases": [],
3166
3007
  "args": {},
3167
- "description": "Add targeting keywords to an ad group",
3008
+ "description": "Create a campaign in Apple Search Ads",
3168
3009
  "examples": [
3169
- "<%= config.bin %> asa keywords add --ad-group UUID --text \"running shoes\" --text \"trail shoes\" --bid 1.20",
3170
- "<%= config.bin %> asa keywords add --ad-group UUID --from-file keywords.txt --match-type EXACT"
3010
+ "<%= config.bin %> asa campaigns create --org UUID --name \"Winter push\" --adam-id 123456 --country US --daily-budget 50"
3171
3011
  ],
3172
3012
  "flags": {
3173
3013
  "json": {
@@ -3199,63 +3039,120 @@
3199
3039
  "multiple": false,
3200
3040
  "type": "option"
3201
3041
  },
3202
- "ad-group": {
3203
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
3204
- "name": "ad-group",
3205
- "required": true,
3042
+ "ad-channel-type": {
3043
+ "description": "Ad channel type",
3044
+ "name": "ad-channel-type",
3045
+ "default": "SEARCH",
3206
3046
  "hasDynamicHelp": false,
3207
3047
  "multiple": false,
3048
+ "options": [
3049
+ "DISPLAY",
3050
+ "SEARCH"
3051
+ ],
3208
3052
  "type": "option"
3209
3053
  },
3210
- "bid": {
3211
- "description": "Bid per keyword (amount, e.g. 50 or 12.50)",
3212
- "name": "bid",
3054
+ "adam-id": {
3055
+ "description": "App Store app ID (adam_id)",
3056
+ "name": "adam-id",
3057
+ "required": true,
3213
3058
  "hasDynamicHelp": false,
3214
3059
  "multiple": false,
3215
3060
  "type": "option"
3216
3061
  },
3217
- "from-file": {
3218
- "description": "File with one keyword per line, combined with any --text values",
3219
- "name": "from-file",
3062
+ "bidding-strategy": {
3063
+ "description": "Bidding strategy; Apple defaults to MANUAL_CPT when omitted",
3064
+ "name": "bidding-strategy",
3220
3065
  "hasDynamicHelp": false,
3221
3066
  "multiple": false,
3067
+ "options": [
3068
+ "MANUAL_CPT",
3069
+ "MAX_CONVERSIONS"
3070
+ ],
3222
3071
  "type": "option"
3223
3072
  },
3224
- "match-type": {
3225
- "description": "Match type",
3226
- "name": "match-type",
3227
- "default": "BROAD",
3073
+ "billing-event": {
3074
+ "description": "Billing event",
3075
+ "name": "billing-event",
3076
+ "default": "TAPS",
3228
3077
  "hasDynamicHelp": false,
3229
3078
  "multiple": false,
3230
3079
  "options": [
3231
- "BROAD",
3232
- "EXACT"
3080
+ "IMPRESSIONS",
3081
+ "TAPS"
3233
3082
  ],
3234
3083
  "type": "option"
3235
3084
  },
3085
+ "budget": {
3086
+ "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
3087
+ "name": "budget",
3088
+ "hasDynamicHelp": false,
3089
+ "multiple": false,
3090
+ "type": "option"
3091
+ },
3092
+ "country": {
3093
+ "description": "Country or region code, repeatable",
3094
+ "name": "country",
3095
+ "required": true,
3096
+ "hasDynamicHelp": false,
3097
+ "multiple": true,
3098
+ "type": "option"
3099
+ },
3100
+ "daily-budget": {
3101
+ "description": "Daily budget (amount, e.g. 50 or 12.50)",
3102
+ "name": "daily-budget",
3103
+ "required": true,
3104
+ "hasDynamicHelp": false,
3105
+ "multiple": false,
3106
+ "type": "option"
3107
+ },
3108
+ "name": {
3109
+ "description": "Campaign name",
3110
+ "name": "name",
3111
+ "required": true,
3112
+ "hasDynamicHelp": false,
3113
+ "multiple": false,
3114
+ "type": "option"
3115
+ },
3116
+ "org": {
3117
+ "description": "Campaign group ID (UUID) — see `adapty asa orgs list`",
3118
+ "name": "org",
3119
+ "required": true,
3120
+ "hasDynamicHelp": false,
3121
+ "multiple": false,
3122
+ "type": "option"
3123
+ },
3236
3124
  "status": {
3237
- "description": "Keyword status",
3125
+ "description": "Initial status",
3238
3126
  "name": "status",
3239
- "default": "ACTIVE",
3240
3127
  "hasDynamicHelp": false,
3241
3128
  "multiple": false,
3242
3129
  "options": [
3243
- "ACTIVE",
3130
+ "ENABLED",
3244
3131
  "PAUSED"
3245
3132
  ],
3246
3133
  "type": "option"
3247
3134
  },
3248
- "text": {
3249
- "description": "Keyword text, repeatable",
3250
- "name": "text",
3135
+ "supply-source": {
3136
+ "description": "Supply source, repeatable",
3137
+ "name": "supply-source",
3138
+ "default": [
3139
+ "APPSTORE_SEARCH_RESULTS"
3140
+ ],
3251
3141
  "hasDynamicHelp": false,
3252
3142
  "multiple": true,
3253
3143
  "type": "option"
3144
+ },
3145
+ "target-cpa": {
3146
+ "description": "Target CPA (amount, e.g. 50 or 12.50)",
3147
+ "name": "target-cpa",
3148
+ "hasDynamicHelp": false,
3149
+ "multiple": false,
3150
+ "type": "option"
3254
3151
  }
3255
3152
  },
3256
3153
  "hasDynamicHelp": false,
3257
3154
  "hiddenAliases": [],
3258
- "id": "asa:keywords:add",
3155
+ "id": "asa:campaigns:create",
3259
3156
  "pluginAlias": "adapty",
3260
3157
  "pluginName": "adapty",
3261
3158
  "pluginType": "core",
@@ -3266,17 +3163,56 @@
3266
3163
  "dist",
3267
3164
  "commands",
3268
3165
  "asa",
3269
- "keywords",
3270
- "add.js"
3166
+ "campaigns",
3167
+ "create.js"
3271
3168
  ]
3272
3169
  },
3273
- "asa:keywords:list": {
3170
+ "asa:campaigns:get": {
3171
+ "aliases": [],
3172
+ "args": {
3173
+ "campaign_id": {
3174
+ "description": "Campaign ID (UUID)",
3175
+ "name": "campaign_id",
3176
+ "required": true
3177
+ }
3178
+ },
3179
+ "description": "Show one campaign; read numbers with asa metrics",
3180
+ "examples": [
3181
+ "<%= config.bin %> asa campaigns get 550e8400-e29b-41d4-a716-446655440000"
3182
+ ],
3183
+ "flags": {
3184
+ "json": {
3185
+ "description": "Format output as json.",
3186
+ "helpGroup": "GLOBAL",
3187
+ "name": "json",
3188
+ "allowNo": false,
3189
+ "type": "boolean"
3190
+ }
3191
+ },
3192
+ "hasDynamicHelp": false,
3193
+ "hiddenAliases": [],
3194
+ "id": "asa:campaigns:get",
3195
+ "pluginAlias": "adapty",
3196
+ "pluginName": "adapty",
3197
+ "pluginType": "core",
3198
+ "strict": true,
3199
+ "enableJsonFlag": true,
3200
+ "isESM": true,
3201
+ "relativePath": [
3202
+ "dist",
3203
+ "commands",
3204
+ "asa",
3205
+ "campaigns",
3206
+ "get.js"
3207
+ ]
3208
+ },
3209
+ "asa:campaigns:list": {
3274
3210
  "aliases": [],
3275
3211
  "args": {},
3276
- "description": "List targeting keywords; read numbers with asa metrics",
3212
+ "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
3277
3213
  "examples": [
3278
- "<%= config.bin %> asa keywords list",
3279
- "<%= config.bin %> asa keywords list --ad-group AD_GROUP_UUID --status ACTIVE"
3214
+ "<%= config.bin %> asa campaigns list",
3215
+ "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
3280
3216
  ],
3281
3217
  "flags": {
3282
3218
  "json": {
@@ -3323,27 +3259,13 @@
3323
3259
  "multiple": false,
3324
3260
  "type": "option"
3325
3261
  },
3326
- "campaign": {
3327
- "description": "Keep only rows in this campaign; repeatable",
3328
- "name": "campaign",
3329
- "hasDynamicHelp": false,
3330
- "multiple": true,
3331
- "type": "option"
3332
- },
3333
- "ad-group": {
3334
- "description": "Keep only rows in this ad group; repeatable",
3335
- "name": "ad-group",
3336
- "hasDynamicHelp": false,
3337
- "multiple": true,
3338
- "type": "option"
3339
- },
3340
3262
  "status": {
3341
3263
  "description": "Keep only rows in this state",
3342
3264
  "name": "status",
3343
3265
  "hasDynamicHelp": false,
3344
3266
  "multiple": false,
3345
3267
  "options": [
3346
- "ACTIVE",
3268
+ "ENABLED",
3347
3269
  "PAUSED"
3348
3270
  ],
3349
3271
  "type": "option"
@@ -3351,7 +3273,7 @@
3351
3273
  },
3352
3274
  "hasDynamicHelp": false,
3353
3275
  "hiddenAliases": [],
3354
- "id": "asa:keywords:list",
3276
+ "id": "asa:campaigns:list",
3355
3277
  "pluginAlias": "adapty",
3356
3278
  "pluginName": "adapty",
3357
3279
  "pluginType": "core",
@@ -3362,23 +3284,23 @@
3362
3284
  "dist",
3363
3285
  "commands",
3364
3286
  "asa",
3365
- "keywords",
3287
+ "campaigns",
3366
3288
  "list.js"
3367
3289
  ]
3368
3290
  },
3369
- "asa:keywords:update": {
3291
+ "asa:campaigns:update": {
3370
3292
  "aliases": [],
3371
3293
  "args": {
3372
- "keyword_id": {
3373
- "description": "Keyword ID (UUID), repeatable as extra arguments",
3374
- "name": "keyword_id",
3294
+ "campaign_id": {
3295
+ "description": "Campaign ID (UUID)",
3296
+ "name": "campaign_id",
3375
3297
  "required": true
3376
3298
  }
3377
3299
  },
3378
- "description": "Change bid, status, text or match type of keywords",
3300
+ "description": "Change a campaign: budgets, countries, status or schedule",
3379
3301
  "examples": [
3380
- "<%= config.bin %> asa keywords update UUID --bid 2.00",
3381
- "<%= config.bin %> asa keywords update UUID_A UUID_B --status PAUSED"
3302
+ "<%= config.bin %> asa campaigns update UUID --status PAUSED",
3303
+ "<%= config.bin %> asa campaigns update UUID --daily-budget 80"
3382
3304
  ],
3383
3305
  "flags": {
3384
3306
  "json": {
@@ -3410,38 +3332,59 @@
3410
3332
  "multiple": false,
3411
3333
  "type": "option"
3412
3334
  },
3413
- "bid": {
3414
- "description": "Bid (amount, e.g. 50 or 12.50)",
3415
- "name": "bid",
3335
+ "bidding-strategy": {
3336
+ "description": "Bidding strategy",
3337
+ "name": "bidding-strategy",
3416
3338
  "hasDynamicHelp": false,
3417
3339
  "multiple": false,
3340
+ "options": [
3341
+ "MANUAL_CPT",
3342
+ "MAX_CONVERSIONS"
3343
+ ],
3418
3344
  "type": "option"
3419
3345
  },
3420
- "match-type": {
3421
- "description": "Match type",
3422
- "name": "match-type",
3346
+ "budget": {
3347
+ "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
3348
+ "name": "budget",
3349
+ "hasDynamicHelp": false,
3350
+ "multiple": false,
3351
+ "type": "option"
3352
+ },
3353
+ "country": {
3354
+ "description": "Replace the country list, repeatable",
3355
+ "name": "country",
3356
+ "hasDynamicHelp": false,
3357
+ "multiple": true,
3358
+ "type": "option"
3359
+ },
3360
+ "daily-budget": {
3361
+ "description": "Daily budget (amount, e.g. 50 or 12.50)",
3362
+ "name": "daily-budget",
3363
+ "hasDynamicHelp": false,
3364
+ "multiple": false,
3365
+ "type": "option"
3366
+ },
3367
+ "name": {
3368
+ "description": "Campaign name",
3369
+ "name": "name",
3423
3370
  "hasDynamicHelp": false,
3424
3371
  "multiple": false,
3425
- "options": [
3426
- "BROAD",
3427
- "EXACT"
3428
- ],
3429
3372
  "type": "option"
3430
3373
  },
3431
3374
  "status": {
3432
- "description": "Keyword status",
3375
+ "description": "Campaign status",
3433
3376
  "name": "status",
3434
3377
  "hasDynamicHelp": false,
3435
3378
  "multiple": false,
3436
3379
  "options": [
3437
- "ACTIVE",
3380
+ "ENABLED",
3438
3381
  "PAUSED"
3439
3382
  ],
3440
3383
  "type": "option"
3441
3384
  },
3442
- "text": {
3443
- "description": "Keyword text (only meaningful for a single keyword)",
3444
- "name": "text",
3385
+ "target-cpa": {
3386
+ "description": "Target CPA (amount, e.g. 50 or 12.50)",
3387
+ "name": "target-cpa",
3445
3388
  "hasDynamicHelp": false,
3446
3389
  "multiple": false,
3447
3390
  "type": "option"
@@ -3449,31 +3392,27 @@
3449
3392
  },
3450
3393
  "hasDynamicHelp": false,
3451
3394
  "hiddenAliases": [],
3452
- "id": "asa:keywords:update",
3395
+ "id": "asa:campaigns:update",
3453
3396
  "pluginAlias": "adapty",
3454
3397
  "pluginName": "adapty",
3455
3398
  "pluginType": "core",
3456
- "strict": false,
3399
+ "strict": true,
3457
3400
  "enableJsonFlag": true,
3458
3401
  "isESM": true,
3459
3402
  "relativePath": [
3460
3403
  "dist",
3461
3404
  "commands",
3462
3405
  "asa",
3463
- "keywords",
3406
+ "campaigns",
3464
3407
  "update.js"
3465
3408
  ]
3466
3409
  },
3467
- "asa:metrics": {
3410
+ "asa:competitors:summary": {
3468
3411
  "aliases": [],
3469
3412
  "args": {},
3470
- "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 coarsest --group-by period: 90 days for\nday or no period grouping, 180 by week, 365 by month and coarser — widen the window by coarsening the\ngrouping, not by splitting into more calls. Budget: 5 metrics calls per minute, at most 2 per 10 seconds.",
3413
+ "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
3471
3414
  "examples": [
3472
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
3473
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --order-by spend --page-size 5",
3474
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --group-by country --page-size 1000",
3475
- "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric roas",
3476
- "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric roas --by-days 7 --by-days 90"
3415
+ "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
3477
3416
  ],
3478
3417
  "flags": {
3479
3418
  "json": {
@@ -3483,111 +3422,18 @@
3483
3422
  "allowNo": false,
3484
3423
  "type": "boolean"
3485
3424
  },
3486
- "page": {
3487
- "description": "Page number",
3488
- "name": "page",
3489
- "default": 1,
3490
- "hasDynamicHelp": false,
3491
- "multiple": false,
3492
- "type": "option"
3493
- },
3494
- "page-size": {
3495
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3496
- "name": "page-size",
3497
- "default": 100,
3498
- "hasDynamicHelp": false,
3499
- "multiple": false,
3500
- "type": "option"
3501
- },
3502
- "by-days": {
3503
- "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
3504
- "name": "by-days",
3505
- "hasDynamicHelp": false,
3506
- "multiple": true,
3507
- "type": "option"
3508
- },
3509
- "date-from": {
3510
- "description": "Start of the period (YYYY-MM-DD)",
3511
- "name": "date-from",
3512
- "required": true,
3513
- "hasDynamicHelp": false,
3514
- "multiple": false,
3515
- "type": "option"
3516
- },
3517
- "date-to": {
3518
- "description": "End of the period (YYYY-MM-DD)",
3519
- "name": "date-to",
3520
- "required": true,
3521
- "hasDynamicHelp": false,
3522
- "multiple": false,
3523
- "type": "option"
3524
- },
3525
- "entity": {
3526
- "description": "What to report on",
3527
- "name": "entity",
3425
+ "app-ids": {
3426
+ "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
3427
+ "name": "app-ids",
3528
3428
  "required": true,
3529
3429
  "hasDynamicHelp": false,
3530
3430
  "multiple": false,
3531
- "options": [
3532
- "ad",
3533
- "ad-group",
3534
- "campaign",
3535
- "keyword"
3536
- ],
3537
- "type": "option"
3538
- },
3539
- "group-by": {
3540
- "description": "Break the rows down by a dimension, repeatable",
3541
- "name": "group-by",
3542
- "hasDynamicHelp": false,
3543
- "multiple": true,
3544
- "options": [
3545
- "country",
3546
- "day",
3547
- "month",
3548
- "quarter",
3549
- "week",
3550
- "year"
3551
- ],
3552
- "type": "option"
3553
- },
3554
- "metric": {
3555
- "description": "Metric name (dashboard nomenclature, e.g. spend, taps, gross_roas), repeatable; omit for every metric; a wrong name fails listing all valid ones",
3556
- "name": "metric",
3557
- "hasDynamicHelp": false,
3558
- "multiple": true,
3559
- "type": "option"
3560
- },
3561
- "order": {
3562
- "description": "Sort direction",
3563
- "name": "order",
3564
- "default": "desc",
3565
- "hasDynamicHelp": false,
3566
- "multiple": false,
3567
- "options": [
3568
- "asc",
3569
- "desc"
3570
- ],
3571
- "type": "option"
3572
- },
3573
- "order-by": {
3574
- "description": "Metric or field to sort by; cohort metrics rank via their gross_/proceeds_/net_ names",
3575
- "name": "order-by",
3576
- "hasDynamicHelp": false,
3577
- "multiple": false,
3578
- "type": "option"
3579
- },
3580
- "order-by-day": {
3581
- "description": "Rank by a cohort metric at this renewal window; must be one of the --by-days values",
3582
- "name": "order-by-day",
3583
- "hasDynamicHelp": false,
3584
- "multiple": false,
3585
3431
  "type": "option"
3586
3432
  }
3587
3433
  },
3588
3434
  "hasDynamicHelp": false,
3589
3435
  "hiddenAliases": [],
3590
- "id": "asa:metrics",
3436
+ "id": "asa:competitors:summary",
3591
3437
  "pluginAlias": "adapty",
3592
3438
  "pluginName": "adapty",
3593
3439
  "pluginType": "core",
@@ -3598,17 +3444,17 @@
3598
3444
  "dist",
3599
3445
  "commands",
3600
3446
  "asa",
3601
- "metrics",
3602
- "index.js"
3447
+ "competitors",
3448
+ "summary.js"
3603
3449
  ]
3604
3450
  },
3605
- "asa:metrics:overview": {
3451
+ "asa:creatives:list": {
3606
3452
  "aliases": [],
3607
3453
  "args": {},
3608
- "description": "Totals for a period, optionally split into day, week or month buckets\n\nThe one-call answer to \"how much did I spend / earn overall\" and to any single-period trend question:\ntotals for the whole entity level plus a per-period series, no pagination, no client-side summing. The\ndate window is capped by --period-unit: 90 days at day, 180 by week, 365 by month and coarser. Shares\nthe 5-per-minute metrics budget with asa metrics.",
3454
+ "description": "List creatives; creative_id is what `asa ads create` needs",
3609
3455
  "examples": [
3610
- "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
3611
- "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --period-unit WEEK"
3456
+ "<%= config.bin %> asa creatives list",
3457
+ "<%= config.bin %> asa creatives list --app APP_UUID"
3612
3458
  ],
3613
3459
  "flags": {
3614
3460
  "json": {
@@ -3618,69 +3464,40 @@
3618
3464
  "allowNo": false,
3619
3465
  "type": "boolean"
3620
3466
  },
3621
- "by-days": {
3622
- "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
3623
- "name": "by-days",
3624
- "hasDynamicHelp": false,
3625
- "multiple": true,
3626
- "type": "option"
3627
- },
3628
- "date-from": {
3629
- "description": "Start of the period (YYYY-MM-DD)",
3630
- "name": "date-from",
3631
- "required": true,
3632
- "hasDynamicHelp": false,
3633
- "multiple": false,
3634
- "type": "option"
3635
- },
3636
- "date-to": {
3637
- "description": "End of the period (YYYY-MM-DD)",
3638
- "name": "date-to",
3639
- "required": true,
3467
+ "page": {
3468
+ "description": "Page number",
3469
+ "name": "page",
3470
+ "default": 1,
3640
3471
  "hasDynamicHelp": false,
3641
3472
  "multiple": false,
3642
3473
  "type": "option"
3643
3474
  },
3644
- "entity": {
3645
- "description": "What to report on",
3646
- "name": "entity",
3647
- "required": true,
3475
+ "page-size": {
3476
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3477
+ "name": "page-size",
3478
+ "default": 100,
3648
3479
  "hasDynamicHelp": false,
3649
3480
  "multiple": false,
3650
- "options": [
3651
- "ad",
3652
- "ad-group",
3653
- "campaign",
3654
- "keyword"
3655
- ],
3656
3481
  "type": "option"
3657
3482
  },
3658
- "metric": {
3659
- "description": "Metric name, repeatable; cohort roots only here (revenue, roas, arpu), not their gross_/proceeds_/net_ variants; omit for every metric",
3660
- "name": "metric",
3483
+ "app": {
3484
+ "description": "Keep only rows in this app; repeatable",
3485
+ "name": "app",
3661
3486
  "hasDynamicHelp": false,
3662
3487
  "multiple": true,
3663
3488
  "type": "option"
3664
3489
  },
3665
- "period-unit": {
3666
- "description": "Bucket size",
3667
- "name": "period-unit",
3668
- "default": "day",
3490
+ "campaign-group": {
3491
+ "description": "Keep only rows in this campaign group; repeatable",
3492
+ "name": "campaign-group",
3669
3493
  "hasDynamicHelp": false,
3670
- "multiple": false,
3671
- "options": [
3672
- "day",
3673
- "month",
3674
- "quarter",
3675
- "week",
3676
- "year"
3677
- ],
3494
+ "multiple": true,
3678
3495
  "type": "option"
3679
3496
  }
3680
3497
  },
3681
3498
  "hasDynamicHelp": false,
3682
3499
  "hiddenAliases": [],
3683
- "id": "asa:metrics:overview",
3500
+ "id": "asa:creatives:list",
3684
3501
  "pluginAlias": "adapty",
3685
3502
  "pluginName": "adapty",
3686
3503
  "pluginType": "core",
@@ -3691,18 +3508,17 @@
3691
3508
  "dist",
3692
3509
  "commands",
3693
3510
  "asa",
3694
- "metrics",
3695
- "overview.js"
3511
+ "creatives",
3512
+ "list.js"
3696
3513
  ]
3697
3514
  },
3698
- "asa:negative-keywords:add": {
3515
+ "asa:keywords:add": {
3699
3516
  "aliases": [],
3700
3517
  "args": {},
3701
- "description": "Add negative keywords to an ad group or across a campaign",
3518
+ "description": "Add targeting keywords to an ad group",
3702
3519
  "examples": [
3703
- "<%= config.bin %> asa negative-keywords add --ad-group UUID --text \"free\"",
3704
- "<%= config.bin %> asa negative-keywords add --campaign UUID --text \"free\" --text \"cheap\"",
3705
- "<%= config.bin %> asa negative-keywords add --campaign UUID --all-ad-groups --text \"free\""
3520
+ "<%= config.bin %> asa keywords add --ad-group UUID --text \"running shoes\" --text \"trail shoes\" --bid 1.20",
3521
+ "<%= config.bin %> asa keywords add --ad-group UUID --from-file keywords.txt --match-type EXACT"
3706
3522
  ],
3707
3523
  "flags": {
3708
3524
  "json": {
@@ -3712,6 +3528,14 @@
3712
3528
  "allowNo": false,
3713
3529
  "type": "boolean"
3714
3530
  },
3531
+ "currency": {
3532
+ "description": "Currency code for the amounts in this call",
3533
+ "name": "currency",
3534
+ "default": "USD",
3535
+ "hasDynamicHelp": false,
3536
+ "multiple": false,
3537
+ "type": "option"
3538
+ },
3715
3539
  "yes": {
3716
3540
  "char": "y",
3717
3541
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -3728,29 +3552,22 @@
3728
3552
  },
3729
3553
  "ad-group": {
3730
3554
  "description": "Ad group ID (UUID) — the campaign is resolved from it",
3731
- "exclusive": [
3732
- "campaign"
3733
- ],
3734
3555
  "name": "ad-group",
3556
+ "required": true,
3735
3557
  "hasDynamicHelp": false,
3736
3558
  "multiple": false,
3737
3559
  "type": "option"
3738
3560
  },
3739
- "all-ad-groups": {
3740
- "dependsOn": [
3741
- "campaign"
3742
- ],
3743
- "description": "Apply to every ad group of the campaign instead of the campaign itself",
3744
- "name": "all-ad-groups",
3745
- "allowNo": false,
3746
- "type": "boolean"
3561
+ "bid": {
3562
+ "description": "Bid per keyword (amount, e.g. 50 or 12.50)",
3563
+ "name": "bid",
3564
+ "hasDynamicHelp": false,
3565
+ "multiple": false,
3566
+ "type": "option"
3747
3567
  },
3748
- "campaign": {
3749
- "description": "Campaign ID (UUID)",
3750
- "exclusive": [
3751
- "ad-group"
3752
- ],
3753
- "name": "campaign",
3568
+ "from-file": {
3569
+ "description": "File with one keyword per line, combined with any --text values",
3570
+ "name": "from-file",
3754
3571
  "hasDynamicHelp": false,
3755
3572
  "multiple": false,
3756
3573
  "type": "option"
@@ -3758,7 +3575,7 @@
3758
3575
  "match-type": {
3759
3576
  "description": "Match type",
3760
3577
  "name": "match-type",
3761
- "default": "EXACT",
3578
+ "default": "BROAD",
3762
3579
  "hasDynamicHelp": false,
3763
3580
  "multiple": false,
3764
3581
  "options": [
@@ -3782,7 +3599,6 @@
3782
3599
  "text": {
3783
3600
  "description": "Keyword text, repeatable",
3784
3601
  "name": "text",
3785
- "required": true,
3786
3602
  "hasDynamicHelp": false,
3787
3603
  "multiple": true,
3788
3604
  "type": "option"
@@ -3790,7 +3606,7 @@
3790
3606
  },
3791
3607
  "hasDynamicHelp": false,
3792
3608
  "hiddenAliases": [],
3793
- "id": "asa:negative-keywords:add",
3609
+ "id": "asa:keywords:add",
3794
3610
  "pluginAlias": "adapty",
3795
3611
  "pluginName": "adapty",
3796
3612
  "pluginType": "core",
@@ -3801,17 +3617,17 @@
3801
3617
  "dist",
3802
3618
  "commands",
3803
3619
  "asa",
3804
- "negative-keywords",
3620
+ "keywords",
3805
3621
  "add.js"
3806
3622
  ]
3807
3623
  },
3808
- "asa:negative-keywords:list": {
3624
+ "asa:keywords:list": {
3809
3625
  "aliases": [],
3810
3626
  "args": {},
3811
- "description": "List negative keywords; ad_group_id is empty for campaign-level ones",
3627
+ "description": "List targeting keywords; read numbers with asa metrics",
3812
3628
  "examples": [
3813
- "<%= config.bin %> asa negative-keywords list",
3814
- "<%= config.bin %> asa negative-keywords list --campaign CAMPAIGN_UUID"
3629
+ "<%= config.bin %> asa keywords list",
3630
+ "<%= config.bin %> asa keywords list --ad-group AD_GROUP_UUID --status ACTIVE"
3815
3631
  ],
3816
3632
  "flags": {
3817
3633
  "json": {
@@ -3872,16 +3688,21 @@
3872
3688
  "multiple": true,
3873
3689
  "type": "option"
3874
3690
  },
3875
- "campaign-level-only": {
3876
- "description": "Keep only campaign-level rows (ad_group_id is null)",
3877
- "name": "campaign-level-only",
3878
- "allowNo": false,
3879
- "type": "boolean"
3691
+ "status": {
3692
+ "description": "Keep only rows in this state",
3693
+ "name": "status",
3694
+ "hasDynamicHelp": false,
3695
+ "multiple": false,
3696
+ "options": [
3697
+ "ACTIVE",
3698
+ "PAUSED"
3699
+ ],
3700
+ "type": "option"
3880
3701
  }
3881
3702
  },
3882
3703
  "hasDynamicHelp": false,
3883
3704
  "hiddenAliases": [],
3884
- "id": "asa:negative-keywords:list",
3705
+ "id": "asa:keywords:list",
3885
3706
  "pluginAlias": "adapty",
3886
3707
  "pluginName": "adapty",
3887
3708
  "pluginType": "core",
@@ -3892,16 +3713,118 @@
3892
3713
  "dist",
3893
3714
  "commands",
3894
3715
  "asa",
3895
- "negative-keywords",
3716
+ "keywords",
3896
3717
  "list.js"
3897
3718
  ]
3898
3719
  },
3899
- "asa:orgs:list": {
3720
+ "asa:keywords:update": {
3721
+ "aliases": [],
3722
+ "args": {
3723
+ "keyword_id": {
3724
+ "description": "Keyword ID (UUID), repeatable as extra arguments",
3725
+ "name": "keyword_id",
3726
+ "required": true
3727
+ }
3728
+ },
3729
+ "description": "Change bid, status, text or match type of keywords",
3730
+ "examples": [
3731
+ "<%= config.bin %> asa keywords update UUID --bid 2.00",
3732
+ "<%= config.bin %> asa keywords update UUID_A UUID_B --status PAUSED"
3733
+ ],
3734
+ "flags": {
3735
+ "json": {
3736
+ "description": "Format output as json.",
3737
+ "helpGroup": "GLOBAL",
3738
+ "name": "json",
3739
+ "allowNo": false,
3740
+ "type": "boolean"
3741
+ },
3742
+ "currency": {
3743
+ "description": "Currency code for the amounts in this call",
3744
+ "name": "currency",
3745
+ "default": "USD",
3746
+ "hasDynamicHelp": false,
3747
+ "multiple": false,
3748
+ "type": "option"
3749
+ },
3750
+ "yes": {
3751
+ "char": "y",
3752
+ "description": "Apply without asking; required when the output is piped or --json is used",
3753
+ "name": "yes",
3754
+ "allowNo": false,
3755
+ "type": "boolean"
3756
+ },
3757
+ "idempotency-key": {
3758
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3759
+ "name": "idempotency-key",
3760
+ "hasDynamicHelp": false,
3761
+ "multiple": false,
3762
+ "type": "option"
3763
+ },
3764
+ "bid": {
3765
+ "description": "Bid (amount, e.g. 50 or 12.50)",
3766
+ "name": "bid",
3767
+ "hasDynamicHelp": false,
3768
+ "multiple": false,
3769
+ "type": "option"
3770
+ },
3771
+ "match-type": {
3772
+ "description": "Match type",
3773
+ "name": "match-type",
3774
+ "hasDynamicHelp": false,
3775
+ "multiple": false,
3776
+ "options": [
3777
+ "BROAD",
3778
+ "EXACT"
3779
+ ],
3780
+ "type": "option"
3781
+ },
3782
+ "status": {
3783
+ "description": "Keyword status",
3784
+ "name": "status",
3785
+ "hasDynamicHelp": false,
3786
+ "multiple": false,
3787
+ "options": [
3788
+ "ACTIVE",
3789
+ "PAUSED"
3790
+ ],
3791
+ "type": "option"
3792
+ },
3793
+ "text": {
3794
+ "description": "Keyword text (only meaningful for a single keyword)",
3795
+ "name": "text",
3796
+ "hasDynamicHelp": false,
3797
+ "multiple": false,
3798
+ "type": "option"
3799
+ }
3800
+ },
3801
+ "hasDynamicHelp": false,
3802
+ "hiddenAliases": [],
3803
+ "id": "asa:keywords:update",
3804
+ "pluginAlias": "adapty",
3805
+ "pluginName": "adapty",
3806
+ "pluginType": "core",
3807
+ "strict": false,
3808
+ "enableJsonFlag": true,
3809
+ "isESM": true,
3810
+ "relativePath": [
3811
+ "dist",
3812
+ "commands",
3813
+ "asa",
3814
+ "keywords",
3815
+ "update.js"
3816
+ ]
3817
+ },
3818
+ "asa:metrics": {
3900
3819
  "aliases": [],
3901
3820
  "args": {},
3902
- "description": "List the Apple Search Ads organizations this company can spend from",
3821
+ "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.",
3903
3822
  "examples": [
3904
- "<%= config.bin %> asa orgs list"
3823
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
3824
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --order-by spend --page-size 5",
3825
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --group-by country --page-size 1000",
3826
+ "<%= config.bin %> asa metrics --entity keyword --date-from 2026-07-01 --date-to 2026-07-31 --metric spend --metric roas",
3827
+ "<%= config.bin %> asa metrics --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --metric roas --by-days 7 --by-days 90"
3905
3828
  ],
3906
3829
  "flags": {
3907
3830
  "json": {
@@ -3911,18 +3834,103 @@
3911
3834
  "allowNo": false,
3912
3835
  "type": "boolean"
3913
3836
  },
3914
- "page": {
3915
- "description": "Page number",
3916
- "name": "page",
3917
- "default": 1,
3837
+ "page": {
3838
+ "description": "Page number",
3839
+ "name": "page",
3840
+ "default": 1,
3841
+ "hasDynamicHelp": false,
3842
+ "multiple": false,
3843
+ "type": "option"
3844
+ },
3845
+ "page-size": {
3846
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3847
+ "name": "page-size",
3848
+ "default": 100,
3849
+ "hasDynamicHelp": false,
3850
+ "multiple": false,
3851
+ "type": "option"
3852
+ },
3853
+ "by-days": {
3854
+ "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
3855
+ "name": "by-days",
3856
+ "hasDynamicHelp": false,
3857
+ "multiple": true,
3858
+ "type": "option"
3859
+ },
3860
+ "date-from": {
3861
+ "description": "Start of the period (YYYY-MM-DD)",
3862
+ "name": "date-from",
3863
+ "required": true,
3864
+ "hasDynamicHelp": false,
3865
+ "multiple": false,
3866
+ "type": "option"
3867
+ },
3868
+ "date-to": {
3869
+ "description": "End of the period (YYYY-MM-DD)",
3870
+ "name": "date-to",
3871
+ "required": true,
3872
+ "hasDynamicHelp": false,
3873
+ "multiple": false,
3874
+ "type": "option"
3875
+ },
3876
+ "entity": {
3877
+ "description": "What to report on",
3878
+ "name": "entity",
3879
+ "required": true,
3880
+ "hasDynamicHelp": false,
3881
+ "multiple": false,
3882
+ "options": [
3883
+ "ad",
3884
+ "ad-group",
3885
+ "campaign",
3886
+ "keyword"
3887
+ ],
3888
+ "type": "option"
3889
+ },
3890
+ "group-by": {
3891
+ "description": "Break the rows down by a dimension, repeatable",
3892
+ "name": "group-by",
3893
+ "hasDynamicHelp": false,
3894
+ "multiple": true,
3895
+ "options": [
3896
+ "country",
3897
+ "day",
3898
+ "month",
3899
+ "quarter",
3900
+ "week",
3901
+ "year"
3902
+ ],
3903
+ "type": "option"
3904
+ },
3905
+ "metric": {
3906
+ "description": "Metric name (dashboard nomenclature, e.g. spend, taps, gross_roas), repeatable; omit for every metric; a wrong name fails listing all valid ones",
3907
+ "name": "metric",
3908
+ "hasDynamicHelp": false,
3909
+ "multiple": true,
3910
+ "type": "option"
3911
+ },
3912
+ "order": {
3913
+ "description": "Sort direction",
3914
+ "name": "order",
3915
+ "default": "desc",
3916
+ "hasDynamicHelp": false,
3917
+ "multiple": false,
3918
+ "options": [
3919
+ "asc",
3920
+ "desc"
3921
+ ],
3922
+ "type": "option"
3923
+ },
3924
+ "order-by": {
3925
+ "description": "Metric or field to sort by; cohort metrics rank via their gross_/proceeds_/net_ names",
3926
+ "name": "order-by",
3918
3927
  "hasDynamicHelp": false,
3919
3928
  "multiple": false,
3920
3929
  "type": "option"
3921
3930
  },
3922
- "page-size": {
3923
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3924
- "name": "page-size",
3925
- "default": 100,
3931
+ "order-by-day": {
3932
+ "description": "Rank by a cohort metric at this renewal window; must be one of the --by-days values",
3933
+ "name": "order-by-day",
3926
3934
  "hasDynamicHelp": false,
3927
3935
  "multiple": false,
3928
3936
  "type": "option"
@@ -3930,7 +3938,7 @@
3930
3938
  },
3931
3939
  "hasDynamicHelp": false,
3932
3940
  "hiddenAliases": [],
3933
- "id": "asa:orgs:list",
3941
+ "id": "asa:metrics",
3934
3942
  "pluginAlias": "adapty",
3935
3943
  "pluginName": "adapty",
3936
3944
  "pluginType": "core",
@@ -3941,17 +3949,17 @@
3941
3949
  "dist",
3942
3950
  "commands",
3943
3951
  "asa",
3944
- "orgs",
3945
- "list.js"
3952
+ "metrics",
3953
+ "index.js"
3946
3954
  ]
3947
3955
  },
3948
- "asa:product-pages:list": {
3956
+ "asa:metrics:overview": {
3949
3957
  "aliases": [],
3950
3958
  "args": {},
3951
- "description": "List custom product pages (read-only; authoring stays in App Store Connect)",
3959
+ "description": "Totals for a period, optionally split into day, week or month buckets\n\nThe one-call answer to \"how much did I spend / earn overall\" and to any single-period trend question:\ntotals for the whole entity level plus a per-period series, no pagination, no client-side summing. The\ndate window is capped by --period-unit: 90 days at day, 180 by week, 365 by month and coarser. Shares\nthe 5-per-minute metrics budget with asa metrics.",
3952
3960
  "examples": [
3953
- "<%= config.bin %> asa product-pages list",
3954
- "<%= config.bin %> asa product-pages list --app APP_UUID"
3961
+ "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31",
3962
+ "<%= config.bin %> asa metrics overview --entity campaign --date-from 2026-07-01 --date-to 2026-07-31 --period-unit WEEK"
3955
3963
  ],
3956
3964
  "flags": {
3957
3965
  "json": {
@@ -3961,40 +3969,69 @@
3961
3969
  "allowNo": false,
3962
3970
  "type": "boolean"
3963
3971
  },
3964
- "page": {
3965
- "description": "Page number",
3966
- "name": "page",
3967
- "default": 1,
3972
+ "by-days": {
3973
+ "description": "Renewal window in days for cohort metrics, repeatable; omit for the dashboard defaults",
3974
+ "name": "by-days",
3975
+ "hasDynamicHelp": false,
3976
+ "multiple": true,
3977
+ "type": "option"
3978
+ },
3979
+ "date-from": {
3980
+ "description": "Start of the period (YYYY-MM-DD)",
3981
+ "name": "date-from",
3982
+ "required": true,
3968
3983
  "hasDynamicHelp": false,
3969
3984
  "multiple": false,
3970
3985
  "type": "option"
3971
3986
  },
3972
- "page-size": {
3973
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3974
- "name": "page-size",
3975
- "default": 100,
3987
+ "date-to": {
3988
+ "description": "End of the period (YYYY-MM-DD)",
3989
+ "name": "date-to",
3990
+ "required": true,
3976
3991
  "hasDynamicHelp": false,
3977
3992
  "multiple": false,
3978
3993
  "type": "option"
3979
3994
  },
3980
- "app": {
3981
- "description": "Keep only rows in this app; repeatable",
3982
- "name": "app",
3995
+ "entity": {
3996
+ "description": "What to report on",
3997
+ "name": "entity",
3998
+ "required": true,
3983
3999
  "hasDynamicHelp": false,
3984
- "multiple": true,
4000
+ "multiple": false,
4001
+ "options": [
4002
+ "ad",
4003
+ "ad-group",
4004
+ "campaign",
4005
+ "keyword"
4006
+ ],
3985
4007
  "type": "option"
3986
4008
  },
3987
- "campaign-group": {
3988
- "description": "Keep only rows in this campaign group; repeatable",
3989
- "name": "campaign-group",
4009
+ "metric": {
4010
+ "description": "Metric name, repeatable; cohort roots only here (revenue, roas, arpu), not their gross_/proceeds_/net_ variants; omit for every metric",
4011
+ "name": "metric",
3990
4012
  "hasDynamicHelp": false,
3991
4013
  "multiple": true,
3992
4014
  "type": "option"
4015
+ },
4016
+ "period-unit": {
4017
+ "description": "Bucket size",
4018
+ "name": "period-unit",
4019
+ "default": "day",
4020
+ "hasDynamicHelp": false,
4021
+ "multiple": false,
4022
+ "options": [
4023
+ "day",
4024
+ "month",
4025
+ "quarter",
4026
+ "week",
4027
+ "year"
4028
+ ],
4029
+ "type": "option"
3993
4030
  }
3994
4031
  },
3995
4032
  "hasDynamicHelp": false,
3996
4033
  "hiddenAliases": [],
3997
- "id": "asa:product-pages:list",
4034
+ "id": "asa:metrics:overview",
3998
4035
  "pluginAlias": "adapty",
3999
4036
  "pluginName": "adapty",
4000
4037
  "pluginType": "core",
@@ -4005,17 +4042,18 @@
4005
4042
  "dist",
4006
4043
  "commands",
4007
4044
  "asa",
4008
- "product-pages",
4009
- "list.js"
4045
+ "metrics",
4046
+ "overview.js"
4010
4047
  ]
4011
4048
  },
4012
- "asa:product-pages:sync": {
4049
+ "asa:negative-keywords:add": {
4013
4050
  "aliases": [],
4014
4051
  "args": {},
4015
- "description": "Refresh custom product pages from Apple",
4052
+ "description": "Add negative keywords to an ad group or across a campaign",
4016
4053
  "examples": [
4017
- "<%= config.bin %> asa product-pages sync",
4018
- "<%= config.bin %> asa product-pages sync --adam-id 123456"
4054
+ "<%= config.bin %> asa negative-keywords add --ad-group UUID --text \"free\"",
4055
+ "<%= config.bin %> asa negative-keywords add --campaign UUID --text \"free\" --text \"cheap\"",
4056
+ "<%= config.bin %> asa negative-keywords add --campaign UUID --all-ad-groups --text \"free\""
4019
4057
  ],
4020
4058
  "flags": {
4021
4059
  "json": {
@@ -4039,17 +4077,71 @@
4039
4077
  "multiple": false,
4040
4078
  "type": "option"
4041
4079
  },
4042
- "adam-id": {
4043
- "description": "Limit the refresh to one app; omit to cover every app",
4044
- "name": "adam-id",
4080
+ "ad-group": {
4081
+ "description": "Ad group ID (UUID) — the campaign is resolved from it",
4082
+ "exclusive": [
4083
+ "campaign"
4084
+ ],
4085
+ "name": "ad-group",
4086
+ "hasDynamicHelp": false,
4087
+ "multiple": false,
4088
+ "type": "option"
4089
+ },
4090
+ "all-ad-groups": {
4091
+ "dependsOn": [
4092
+ "campaign"
4093
+ ],
4094
+ "description": "Apply to every ad group of the campaign instead of the campaign itself",
4095
+ "name": "all-ad-groups",
4096
+ "allowNo": false,
4097
+ "type": "boolean"
4098
+ },
4099
+ "campaign": {
4100
+ "description": "Campaign ID (UUID)",
4101
+ "exclusive": [
4102
+ "ad-group"
4103
+ ],
4104
+ "name": "campaign",
4105
+ "hasDynamicHelp": false,
4106
+ "multiple": false,
4107
+ "type": "option"
4108
+ },
4109
+ "match-type": {
4110
+ "description": "Match type",
4111
+ "name": "match-type",
4112
+ "default": "EXACT",
4113
+ "hasDynamicHelp": false,
4114
+ "multiple": false,
4115
+ "options": [
4116
+ "BROAD",
4117
+ "EXACT"
4118
+ ],
4119
+ "type": "option"
4120
+ },
4121
+ "status": {
4122
+ "description": "Keyword status",
4123
+ "name": "status",
4124
+ "default": "ACTIVE",
4045
4125
  "hasDynamicHelp": false,
4046
4126
  "multiple": false,
4127
+ "options": [
4128
+ "ACTIVE",
4129
+ "PAUSED"
4130
+ ],
4131
+ "type": "option"
4132
+ },
4133
+ "text": {
4134
+ "description": "Keyword text, repeatable",
4135
+ "name": "text",
4136
+ "required": true,
4137
+ "hasDynamicHelp": false,
4138
+ "multiple": true,
4047
4139
  "type": "option"
4048
4140
  }
4049
4141
  },
4050
4142
  "hasDynamicHelp": false,
4051
4143
  "hiddenAliases": [],
4052
- "id": "asa:product-pages:sync",
4144
+ "id": "asa:negative-keywords:add",
4053
4145
  "pluginAlias": "adapty",
4054
4146
  "pluginName": "adapty",
4055
4147
  "pluginType": "core",
@@ -4060,17 +4152,17 @@
4060
4152
  "dist",
4061
4153
  "commands",
4062
4154
  "asa",
4063
- "product-pages",
4064
- "sync.js"
4155
+ "negative-keywords",
4156
+ "add.js"
4065
4157
  ]
4066
4158
  },
4067
- "asa:search-terms:list": {
4159
+ "asa:negative-keywords:list": {
4068
4160
  "aliases": [],
4069
4161
  "args": {},
4070
- "description": "List the search terms your ads matched, with their metrics",
4162
+ "description": "List negative keywords; ad_group_id is empty for campaign-level ones",
4071
4163
  "examples": [
4072
- "<%= config.bin %> asa search-terms list --date-from 2026-07-01 --date-to 2026-07-31",
4073
- "<%= config.bin %> asa search-terms list --ad-group AD_GROUP_UUID"
4164
+ "<%= config.bin %> asa negative-keywords list",
4165
+ "<%= config.bin %> asa negative-keywords list --campaign CAMPAIGN_UUID"
4074
4166
  ],
4075
4167
  "flags": {
4076
4168
  "json": {
@@ -4096,20 +4188,6 @@
4096
4188
  "multiple": false,
4097
4189
  "type": "option"
4098
4190
  },
4099
- "date-from": {
4100
- "description": "Start of the reporting period (YYYY-MM-DD), defaults to today",
4101
- "name": "date-from",
4102
- "hasDynamicHelp": false,
4103
- "multiple": false,
4104
- "type": "option"
4105
- },
4106
- "date-to": {
4107
- "description": "End of the reporting period (YYYY-MM-DD), defaults to today",
4108
- "name": "date-to",
4109
- "hasDynamicHelp": false,
4110
- "multiple": false,
4111
- "type": "option"
4112
- },
4113
4191
  "app": {
4114
4192
  "description": "Keep only rows in this app; repeatable",
4115
4193
  "name": "app",
@@ -4144,58 +4222,17 @@
4144
4222
  "hasDynamicHelp": false,
4145
4223
  "multiple": true,
4146
4224
  "type": "option"
4147
- }
4148
- },
4149
- "hasDynamicHelp": false,
4150
- "hiddenAliases": [],
4151
- "id": "asa:search-terms:list",
4152
- "pluginAlias": "adapty",
4153
- "pluginName": "adapty",
4154
- "pluginType": "core",
4155
- "strict": true,
4156
- "enableJsonFlag": true,
4157
- "isESM": true,
4158
- "relativePath": [
4159
- "dist",
4160
- "commands",
4161
- "asa",
4162
- "search-terms",
4163
- "list.js"
4164
- ]
4165
- },
4166
- "flows:config:get": {
4167
- "aliases": [],
4168
- "args": {
4169
- "flow_id": {
4170
- "description": "Flow ID (UUID)",
4171
- "name": "flow_id",
4172
- "required": true
4173
- }
4174
- },
4175
- "description": "Read the flow builder config (404 until the config has been written at least once)",
4176
- "examples": [
4177
- "<%= config.bin %> flows config get --app UUID 550e8400-e29b-41d4-a716-446655440000"
4178
- ],
4179
- "flags": {
4180
- "json": {
4181
- "description": "Format output as json.",
4182
- "helpGroup": "GLOBAL",
4183
- "name": "json",
4184
- "allowNo": false,
4185
- "type": "boolean"
4186
4225
  },
4187
- "app": {
4188
- "description": "App ID (UUID)",
4189
- "name": "app",
4190
- "required": true,
4191
- "hasDynamicHelp": false,
4192
- "multiple": false,
4193
- "type": "option"
4226
+ "campaign-level-only": {
4227
+ "description": "Keep only campaign-level rows (ad_group_id is null)",
4228
+ "name": "campaign-level-only",
4229
+ "allowNo": false,
4230
+ "type": "boolean"
4194
4231
  }
4195
4232
  },
4196
4233
  "hasDynamicHelp": false,
4197
4234
  "hiddenAliases": [],
4198
- "id": "flows:config:get",
4235
+ "id": "asa:negative-keywords:list",
4199
4236
  "pluginAlias": "adapty",
4200
4237
  "pluginName": "adapty",
4201
4238
  "pluginType": "core",
@@ -4205,26 +4242,17 @@
4205
4242
  "relativePath": [
4206
4243
  "dist",
4207
4244
  "commands",
4208
- "flows",
4209
- "config",
4210
- "get.js"
4245
+ "asa",
4246
+ "negative-keywords",
4247
+ "list.js"
4211
4248
  ]
4212
4249
  },
4213
- "flows:config:preview": {
4250
+ "asa:orgs:list": {
4214
4251
  "aliases": [],
4215
- "args": {
4216
- "config_file": {
4217
- "description": "Path to a local flow config JSON file",
4218
- "name": "config_file",
4219
- "required": true
4220
- }
4221
- },
4222
- "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.",
4252
+ "args": {},
4253
+ "description": "List the Apple Search Ads organizations this company can spend from",
4223
4254
  "examples": [
4224
- "<%= config.bin %> flows config preview ./config.json",
4225
- "<%= config.bin %> flows config preview ./config.json --screen welcome --device ipad-pro --orientation landscape",
4226
- "# 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",
4227
- "# 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"
4255
+ "<%= config.bin %> asa orgs list"
4228
4256
  ],
4229
4257
  "flags": {
4230
4258
  "json": {
@@ -4234,29 +4262,18 @@
4234
4262
  "allowNo": false,
4235
4263
  "type": "boolean"
4236
4264
  },
4237
- "device": {
4238
- "description": "Device frame to render in",
4239
- "name": "device",
4240
- "default": "iphone-14",
4241
- "hasDynamicHelp": false,
4242
- "multiple": false,
4243
- "type": "option"
4244
- },
4245
- "orientation": {
4246
- "description": "Device orientation to render in",
4247
- "name": "orientation",
4248
- "default": "portrait",
4265
+ "page": {
4266
+ "description": "Page number",
4267
+ "name": "page",
4268
+ "default": 1,
4249
4269
  "hasDynamicHelp": false,
4250
4270
  "multiple": false,
4251
- "options": [
4252
- "landscape",
4253
- "portrait"
4254
- ],
4255
4271
  "type": "option"
4256
4272
  },
4257
- "screen": {
4258
- "description": "Screen ID to render (default: the flow's first screen)",
4259
- "name": "screen",
4273
+ "page-size": {
4274
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4275
+ "name": "page-size",
4276
+ "default": 100,
4260
4277
  "hasDynamicHelp": false,
4261
4278
  "multiple": false,
4262
4279
  "type": "option"
@@ -4264,7 +4281,7 @@
4264
4281
  },
4265
4282
  "hasDynamicHelp": false,
4266
4283
  "hiddenAliases": [],
4267
- "id": "flows:config:preview",
4284
+ "id": "asa:orgs:list",
4268
4285
  "pluginAlias": "adapty",
4269
4286
  "pluginName": "adapty",
4270
4287
  "pluginType": "core",
@@ -4274,25 +4291,18 @@
4274
4291
  "relativePath": [
4275
4292
  "dist",
4276
4293
  "commands",
4277
- "flows",
4278
- "config",
4279
- "preview.js"
4294
+ "asa",
4295
+ "orgs",
4296
+ "list.js"
4280
4297
  ]
4281
4298
  },
4282
- "flows:config:update": {
4299
+ "asa:product-pages:list": {
4283
4300
  "aliases": [],
4284
- "args": {
4285
- "flow_id": {
4286
- "description": "Flow ID (UUID)",
4287
- "name": "flow_id",
4288
- "required": true
4289
- }
4290
- },
4291
- "description": "Write the flow builder config (creates the first version, or edits/forks the current one)",
4301
+ "args": {},
4302
+ "description": "List custom product pages (read-only; authoring stays in App Store Connect)",
4292
4303
  "examples": [
4293
- "<%= config.bin %> flows config update --app UUID FLOW_UUID --config-file config.json",
4294
- "cat config.json | <%= config.bin %> flows config update --app UUID FLOW_UUID --config-file -",
4295
- "<%= config.bin %> flows config update --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}' --expected-updated-at 1755001800000"
4304
+ "<%= config.bin %> asa product-pages list",
4305
+ "<%= config.bin %> asa product-pages list --app APP_UUID"
4296
4306
  ],
4297
4307
  "flags": {
4298
4308
  "json": {
@@ -4302,46 +4312,40 @@
4302
4312
  "allowNo": false,
4303
4313
  "type": "boolean"
4304
4314
  },
4305
- "app": {
4306
- "description": "App ID (UUID)",
4307
- "name": "app",
4308
- "required": true,
4309
- "hasDynamicHelp": false,
4310
- "multiple": false,
4311
- "type": "option"
4312
- },
4313
- "config": {
4314
- "description": "Builder config as a JSON string",
4315
- "name": "config",
4315
+ "page": {
4316
+ "description": "Page number",
4317
+ "name": "page",
4318
+ "default": 1,
4316
4319
  "hasDynamicHelp": false,
4317
4320
  "multiple": false,
4318
4321
  "type": "option"
4319
4322
  },
4320
- "config-file": {
4321
- "description": "JSON file with the builder config, or - to read stdin",
4322
- "name": "config-file",
4323
+ "page-size": {
4324
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4325
+ "name": "page-size",
4326
+ "default": 100,
4323
4327
  "hasDynamicHelp": false,
4324
4328
  "multiple": false,
4325
4329
  "type": "option"
4326
4330
  },
4327
- "expected-updated-at": {
4328
- "description": "Optimistic lock: the `updated_at` from a prior config read. Omit for last-write-wins.",
4329
- "name": "expected-updated-at",
4331
+ "app": {
4332
+ "description": "Keep only rows in this app; repeatable",
4333
+ "name": "app",
4330
4334
  "hasDynamicHelp": false,
4331
- "multiple": false,
4335
+ "multiple": true,
4332
4336
  "type": "option"
4333
4337
  },
4334
- "remote-configs": {
4335
- "description": "JSON array of remote config entries: [{locale, data}]",
4336
- "name": "remote-configs",
4338
+ "campaign-group": {
4339
+ "description": "Keep only rows in this campaign group; repeatable",
4340
+ "name": "campaign-group",
4337
4341
  "hasDynamicHelp": false,
4338
- "multiple": false,
4342
+ "multiple": true,
4339
4343
  "type": "option"
4340
4344
  }
4341
4345
  },
4342
4346
  "hasDynamicHelp": false,
4343
4347
  "hiddenAliases": [],
4344
- "id": "flows:config:update",
4348
+ "id": "asa:product-pages:list",
4345
4349
  "pluginAlias": "adapty",
4346
4350
  "pluginName": "adapty",
4347
4351
  "pluginType": "core",
@@ -4351,25 +4355,18 @@
4351
4355
  "relativePath": [
4352
4356
  "dist",
4353
4357
  "commands",
4354
- "flows",
4355
- "config",
4356
- "update.js"
4358
+ "asa",
4359
+ "product-pages",
4360
+ "list.js"
4357
4361
  ]
4358
4362
  },
4359
- "flows:config:validate": {
4363
+ "asa:product-pages:sync": {
4360
4364
  "aliases": [],
4361
- "args": {
4362
- "flow_id": {
4363
- "description": "Flow ID (UUID)",
4364
- "name": "flow_id",
4365
- "required": true
4366
- }
4367
- },
4368
- "description": "Check whether a builder config is publishable (advisory; does not save). Exits non-zero when the config is not publishable.",
4365
+ "args": {},
4366
+ "description": "Refresh custom product pages from Apple",
4369
4367
  "examples": [
4370
- "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file config.json",
4371
- "cat config.json | <%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file -",
4372
- "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}'"
4368
+ "<%= config.bin %> asa product-pages sync",
4369
+ "<%= config.bin %> asa product-pages sync --adam-id 123456"
4373
4370
  ],
4374
4371
  "flags": {
4375
4372
  "json": {
@@ -4379,24 +4376,23 @@
4379
4376
  "allowNo": false,
4380
4377
  "type": "boolean"
4381
4378
  },
4382
- "app": {
4383
- "description": "App ID (UUID)",
4384
- "name": "app",
4385
- "required": true,
4386
- "hasDynamicHelp": false,
4387
- "multiple": false,
4388
- "type": "option"
4379
+ "yes": {
4380
+ "char": "y",
4381
+ "description": "Apply without asking; required when the output is piped or --json is used",
4382
+ "name": "yes",
4383
+ "allowNo": false,
4384
+ "type": "boolean"
4389
4385
  },
4390
- "config": {
4391
- "description": "Builder config as a JSON string",
4392
- "name": "config",
4386
+ "idempotency-key": {
4387
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4388
+ "name": "idempotency-key",
4393
4389
  "hasDynamicHelp": false,
4394
4390
  "multiple": false,
4395
4391
  "type": "option"
4396
4392
  },
4397
- "config-file": {
4398
- "description": "JSON file with the builder config, or - to read stdin",
4399
- "name": "config-file",
4393
+ "adam-id": {
4394
+ "description": "Limit the refresh to one app; omit to cover every app",
4395
+ "name": "adam-id",
4400
4396
  "hasDynamicHelp": false,
4401
4397
  "multiple": false,
4402
4398
  "type": "option"
@@ -4404,7 +4400,7 @@
4404
4400
  },
4405
4401
  "hasDynamicHelp": false,
4406
4402
  "hiddenAliases": [],
4407
- "id": "flows:config:validate",
4403
+ "id": "asa:product-pages:sync",
4408
4404
  "pluginAlias": "adapty",
4409
4405
  "pluginName": "adapty",
4410
4406
  "pluginType": "core",
@@ -4414,18 +4410,18 @@
4414
4410
  "relativePath": [
4415
4411
  "dist",
4416
4412
  "commands",
4417
- "flows",
4418
- "config",
4419
- "validate.js"
4413
+ "asa",
4414
+ "product-pages",
4415
+ "sync.js"
4420
4416
  ]
4421
4417
  },
4422
- "asa:automations:create": {
4418
+ "asa:search-terms:list": {
4423
4419
  "aliases": [],
4424
4420
  "args": {},
4425
- "description": "Create an automation rule from a JSON rule file",
4421
+ "description": "List the search terms your ads matched, with their metrics",
4426
4422
  "examples": [
4427
- "<%= config.bin %> asa automations create --file rule.json",
4428
- "<%= config.bin %> asa automations create --file rule.json --run-now"
4423
+ "<%= config.bin %> asa search-terms list --date-from 2026-07-01 --date-to 2026-07-31",
4424
+ "<%= config.bin %> asa search-terms list --ad-group AD_GROUP_UUID"
4429
4425
  ],
4430
4426
  "flags": {
4431
4427
  "json": {
@@ -4435,38 +4431,75 @@
4435
4431
  "allowNo": false,
4436
4432
  "type": "boolean"
4437
4433
  },
4438
- "yes": {
4439
- "char": "y",
4440
- "description": "Apply without asking; required when the output is piped or --json is used",
4441
- "name": "yes",
4442
- "allowNo": false,
4443
- "type": "boolean"
4434
+ "page": {
4435
+ "description": "Page number",
4436
+ "name": "page",
4437
+ "default": 1,
4438
+ "hasDynamicHelp": false,
4439
+ "multiple": false,
4440
+ "type": "option"
4444
4441
  },
4445
- "idempotency-key": {
4446
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4447
- "name": "idempotency-key",
4442
+ "page-size": {
4443
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4444
+ "name": "page-size",
4445
+ "default": 100,
4448
4446
  "hasDynamicHelp": false,
4449
4447
  "multiple": false,
4450
4448
  "type": "option"
4451
4449
  },
4452
- "file": {
4453
- "description": "JSON file with the rule body, or - to read stdin",
4454
- "name": "file",
4455
- "required": true,
4450
+ "date-from": {
4451
+ "description": "Start of the reporting period (YYYY-MM-DD), defaults to today",
4452
+ "name": "date-from",
4456
4453
  "hasDynamicHelp": false,
4457
4454
  "multiple": false,
4458
4455
  "type": "option"
4459
4456
  },
4460
- "run-now": {
4461
- "description": "Queue the first run right after the rule is stored",
4462
- "name": "run-now",
4463
- "allowNo": false,
4464
- "type": "boolean"
4457
+ "date-to": {
4458
+ "description": "End of the reporting period (YYYY-MM-DD), defaults to today",
4459
+ "name": "date-to",
4460
+ "hasDynamicHelp": false,
4461
+ "multiple": false,
4462
+ "type": "option"
4463
+ },
4464
+ "app": {
4465
+ "description": "Keep only rows in this app; repeatable",
4466
+ "name": "app",
4467
+ "hasDynamicHelp": false,
4468
+ "multiple": true,
4469
+ "type": "option"
4470
+ },
4471
+ "campaign-group": {
4472
+ "description": "Keep only rows in this campaign group; repeatable",
4473
+ "name": "campaign-group",
4474
+ "hasDynamicHelp": false,
4475
+ "multiple": true,
4476
+ "type": "option"
4477
+ },
4478
+ "search": {
4479
+ "description": "Case-insensitive substring match on the name",
4480
+ "name": "search",
4481
+ "hasDynamicHelp": false,
4482
+ "multiple": false,
4483
+ "type": "option"
4484
+ },
4485
+ "campaign": {
4486
+ "description": "Keep only rows in this campaign; repeatable",
4487
+ "name": "campaign",
4488
+ "hasDynamicHelp": false,
4489
+ "multiple": true,
4490
+ "type": "option"
4491
+ },
4492
+ "ad-group": {
4493
+ "description": "Keep only rows in this ad group; repeatable",
4494
+ "name": "ad-group",
4495
+ "hasDynamicHelp": false,
4496
+ "multiple": true,
4497
+ "type": "option"
4465
4498
  }
4466
4499
  },
4467
4500
  "hasDynamicHelp": false,
4468
4501
  "hiddenAliases": [],
4469
- "id": "asa:automations:create",
4502
+ "id": "asa:search-terms:list",
4470
4503
  "pluginAlias": "adapty",
4471
4504
  "pluginName": "adapty",
4472
4505
  "pluginType": "core",
@@ -4477,22 +4510,22 @@
4477
4510
  "dist",
4478
4511
  "commands",
4479
4512
  "asa",
4480
- "automations",
4481
- "create.js"
4513
+ "search-terms",
4514
+ "list.js"
4482
4515
  ]
4483
4516
  },
4484
- "asa:automations:get": {
4517
+ "flows:config:get": {
4485
4518
  "aliases": [],
4486
4519
  "args": {
4487
- "automation_id": {
4488
- "description": "Automation rule ID (UUID)",
4489
- "name": "automation_id",
4520
+ "flow_id": {
4521
+ "description": "Flow ID (UUID)",
4522
+ "name": "flow_id",
4490
4523
  "required": true
4491
4524
  }
4492
4525
  },
4493
- "description": "Show one automation rule with its conditions and actions",
4526
+ "description": "Read the flow builder config (404 until the config has been written at least once)",
4494
4527
  "examples": [
4495
- "<%= config.bin %> asa automations get 550e8400-e29b-41d4-a716-446655440000"
4528
+ "<%= config.bin %> flows config get --app UUID 550e8400-e29b-41d4-a716-446655440000"
4496
4529
  ],
4497
4530
  "flags": {
4498
4531
  "json": {
@@ -4501,11 +4534,19 @@
4501
4534
  "name": "json",
4502
4535
  "allowNo": false,
4503
4536
  "type": "boolean"
4537
+ },
4538
+ "app": {
4539
+ "description": "App ID (UUID)",
4540
+ "name": "app",
4541
+ "required": true,
4542
+ "hasDynamicHelp": false,
4543
+ "multiple": false,
4544
+ "type": "option"
4504
4545
  }
4505
4546
  },
4506
4547
  "hasDynamicHelp": false,
4507
4548
  "hiddenAliases": [],
4508
- "id": "asa:automations:get",
4549
+ "id": "flows:config:get",
4509
4550
  "pluginAlias": "adapty",
4510
4551
  "pluginName": "adapty",
4511
4552
  "pluginType": "core",
@@ -4515,17 +4556,26 @@
4515
4556
  "relativePath": [
4516
4557
  "dist",
4517
4558
  "commands",
4518
- "asa",
4519
- "automations",
4559
+ "flows",
4560
+ "config",
4520
4561
  "get.js"
4521
4562
  ]
4522
4563
  },
4523
- "asa:automations:list": {
4564
+ "flows:config:preview": {
4524
4565
  "aliases": [],
4525
- "args": {},
4526
- "description": "List automation rules; status 1 is active, 0 is stopped",
4566
+ "args": {
4567
+ "config_file": {
4568
+ "description": "Path to a local flow config JSON file",
4569
+ "name": "config_file",
4570
+ "required": true
4571
+ }
4572
+ },
4573
+ "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.",
4527
4574
  "examples": [
4528
- "<%= config.bin %> asa automations list"
4575
+ "<%= config.bin %> flows config preview ./config.json",
4576
+ "<%= config.bin %> flows config preview ./config.json --screen welcome --device ipad-pro --orientation landscape",
4577
+ "# 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",
4578
+ "# 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"
4529
4579
  ],
4530
4580
  "flags": {
4531
4581
  "json": {
@@ -4535,18 +4585,29 @@
4535
4585
  "allowNo": false,
4536
4586
  "type": "boolean"
4537
4587
  },
4538
- "page": {
4539
- "description": "Page number",
4540
- "name": "page",
4541
- "default": 1,
4588
+ "device": {
4589
+ "description": "Device frame to render in",
4590
+ "name": "device",
4591
+ "default": "iphone-14",
4542
4592
  "hasDynamicHelp": false,
4543
4593
  "multiple": false,
4544
4594
  "type": "option"
4545
4595
  },
4546
- "page-size": {
4547
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4548
- "name": "page-size",
4549
- "default": 100,
4596
+ "orientation": {
4597
+ "description": "Device orientation to render in",
4598
+ "name": "orientation",
4599
+ "default": "portrait",
4600
+ "hasDynamicHelp": false,
4601
+ "multiple": false,
4602
+ "options": [
4603
+ "landscape",
4604
+ "portrait"
4605
+ ],
4606
+ "type": "option"
4607
+ },
4608
+ "screen": {
4609
+ "description": "Screen ID to render (default: the flow's first screen)",
4610
+ "name": "screen",
4550
4611
  "hasDynamicHelp": false,
4551
4612
  "multiple": false,
4552
4613
  "type": "option"
@@ -4554,7 +4615,7 @@
4554
4615
  },
4555
4616
  "hasDynamicHelp": false,
4556
4617
  "hiddenAliases": [],
4557
- "id": "asa:automations:list",
4618
+ "id": "flows:config:preview",
4558
4619
  "pluginAlias": "adapty",
4559
4620
  "pluginName": "adapty",
4560
4621
  "pluginType": "core",
@@ -4564,24 +4625,25 @@
4564
4625
  "relativePath": [
4565
4626
  "dist",
4566
4627
  "commands",
4567
- "asa",
4568
- "automations",
4569
- "list.js"
4628
+ "flows",
4629
+ "config",
4630
+ "preview.js"
4570
4631
  ]
4571
4632
  },
4572
- "asa:automations:run": {
4633
+ "flows:config:update": {
4573
4634
  "aliases": [],
4574
4635
  "args": {
4575
- "automation_id": {
4576
- "description": "Automation rule ID (UUID)",
4577
- "name": "automation_id",
4636
+ "flow_id": {
4637
+ "description": "Flow ID (UUID)",
4638
+ "name": "flow_id",
4578
4639
  "required": true
4579
4640
  }
4580
4641
  },
4581
- "description": "Run an automation rule now; the run is queued, not awaited",
4642
+ "description": "Write the flow builder config (creates the first version, or edits/forks the current one)",
4582
4643
  "examples": [
4583
- "<%= config.bin %> asa automations run UUID",
4584
- "<%= config.bin %> asa automations run UUID --dry-run"
4644
+ "<%= config.bin %> flows config update --app UUID FLOW_UUID --config-file config.json",
4645
+ "cat config.json | <%= config.bin %> flows config update --app UUID FLOW_UUID --config-file -",
4646
+ "<%= config.bin %> flows config update --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}' --expected-updated-at 1755001800000"
4585
4647
  ],
4586
4648
  "flags": {
4587
4649
  "json": {
@@ -4591,77 +4653,38 @@
4591
4653
  "allowNo": false,
4592
4654
  "type": "boolean"
4593
4655
  },
4594
- "yes": {
4595
- "char": "y",
4596
- "description": "Apply without asking; required when the output is piped or --json is used",
4597
- "name": "yes",
4598
- "allowNo": false,
4599
- "type": "boolean"
4656
+ "app": {
4657
+ "description": "App ID (UUID)",
4658
+ "name": "app",
4659
+ "required": true,
4660
+ "hasDynamicHelp": false,
4661
+ "multiple": false,
4662
+ "type": "option"
4600
4663
  },
4601
- "idempotency-key": {
4602
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4603
- "name": "idempotency-key",
4664
+ "config": {
4665
+ "description": "Builder config as a JSON string",
4666
+ "name": "config",
4604
4667
  "hasDynamicHelp": false,
4605
4668
  "multiple": false,
4606
4669
  "type": "option"
4607
4670
  },
4608
- "dry-run": {
4609
- "description": "Evaluate and log the rule without touching Apple",
4610
- "name": "dry-run",
4611
- "allowNo": false,
4612
- "type": "boolean"
4613
- }
4614
- },
4615
- "hasDynamicHelp": false,
4616
- "hiddenAliases": [],
4617
- "id": "asa:automations:run",
4618
- "pluginAlias": "adapty",
4619
- "pluginName": "adapty",
4620
- "pluginType": "core",
4621
- "strict": true,
4622
- "enableJsonFlag": true,
4623
- "isESM": true,
4624
- "relativePath": [
4625
- "dist",
4626
- "commands",
4627
- "asa",
4628
- "automations",
4629
- "run.js"
4630
- ]
4631
- },
4632
- "asa:automations:runs": {
4633
- "aliases": [],
4634
- "args": {
4635
- "automation_id": {
4636
- "description": "Automation rule ID (UUID)",
4637
- "name": "automation_id",
4638
- "required": true
4639
- }
4640
- },
4641
- "description": "List past runs of an automation rule, including dry runs",
4642
- "examples": [
4643
- "<%= config.bin %> asa automations runs 550e8400-e29b-41d4-a716-446655440000"
4644
- ],
4645
- "flags": {
4646
- "json": {
4647
- "description": "Format output as json.",
4648
- "helpGroup": "GLOBAL",
4649
- "name": "json",
4650
- "allowNo": false,
4651
- "type": "boolean"
4671
+ "config-file": {
4672
+ "description": "JSON file with the builder config, or - to read stdin",
4673
+ "name": "config-file",
4674
+ "hasDynamicHelp": false,
4675
+ "multiple": false,
4676
+ "type": "option"
4652
4677
  },
4653
- "page": {
4654
- "description": "Page number",
4655
- "name": "page",
4656
- "default": 1,
4678
+ "expected-updated-at": {
4679
+ "description": "Optimistic lock: the `updated_at` from a prior config read. Omit for last-write-wins.",
4680
+ "name": "expected-updated-at",
4657
4681
  "hasDynamicHelp": false,
4658
4682
  "multiple": false,
4659
4683
  "type": "option"
4660
4684
  },
4661
- "page-size": {
4662
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4663
- "name": "page-size",
4664
- "default": 100,
4685
+ "remote-configs": {
4686
+ "description": "JSON array of remote config entries: [{locale, data}]",
4687
+ "name": "remote-configs",
4665
4688
  "hasDynamicHelp": false,
4666
4689
  "multiple": false,
4667
4690
  "type": "option"
@@ -4669,7 +4692,7 @@
4669
4692
  },
4670
4693
  "hasDynamicHelp": false,
4671
4694
  "hiddenAliases": [],
4672
- "id": "asa:automations:runs",
4695
+ "id": "flows:config:update",
4673
4696
  "pluginAlias": "adapty",
4674
4697
  "pluginName": "adapty",
4675
4698
  "pluginType": "core",
@@ -4679,24 +4702,25 @@
4679
4702
  "relativePath": [
4680
4703
  "dist",
4681
4704
  "commands",
4682
- "asa",
4683
- "automations",
4684
- "runs.js"
4705
+ "flows",
4706
+ "config",
4707
+ "update.js"
4685
4708
  ]
4686
4709
  },
4687
- "asa:automations:update": {
4710
+ "flows:config:validate": {
4688
4711
  "aliases": [],
4689
4712
  "args": {
4690
- "automation_id": {
4691
- "description": "Automation rule ID (UUID)",
4692
- "name": "automation_id",
4713
+ "flow_id": {
4714
+ "description": "Flow ID (UUID)",
4715
+ "name": "flow_id",
4693
4716
  "required": true
4694
4717
  }
4695
4718
  },
4696
- "description": "Change an automation rule: stop it, rename it, or replace parts of the rule",
4719
+ "description": "Check whether a builder config is publishable (advisory; does not save). Exits non-zero when the config is not publishable.",
4697
4720
  "examples": [
4698
- "<%= config.bin %> asa automations update UUID --stop",
4699
- "<%= config.bin %> asa automations update UUID --file rule.json"
4721
+ "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file config.json",
4722
+ "cat config.json | <%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file -",
4723
+ "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}'"
4700
4724
  ],
4701
4725
  "flags": {
4702
4726
  "json": {
@@ -4706,56 +4730,32 @@
4706
4730
  "allowNo": false,
4707
4731
  "type": "boolean"
4708
4732
  },
4709
- "yes": {
4710
- "char": "y",
4711
- "description": "Apply without asking; required when the output is piped or --json is used",
4712
- "name": "yes",
4713
- "allowNo": false,
4714
- "type": "boolean"
4715
- },
4716
- "idempotency-key": {
4717
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
4718
- "name": "idempotency-key",
4733
+ "app": {
4734
+ "description": "App ID (UUID)",
4735
+ "name": "app",
4736
+ "required": true,
4719
4737
  "hasDynamicHelp": false,
4720
4738
  "multiple": false,
4721
4739
  "type": "option"
4722
4740
  },
4723
- "file": {
4724
- "description": "JSON file with the parts to change, or - to read stdin",
4725
- "name": "file",
4741
+ "config": {
4742
+ "description": "Builder config as a JSON string",
4743
+ "name": "config",
4726
4744
  "hasDynamicHelp": false,
4727
4745
  "multiple": false,
4728
4746
  "type": "option"
4729
4747
  },
4730
- "name": {
4731
- "description": "Rule name",
4732
- "name": "name",
4748
+ "config-file": {
4749
+ "description": "JSON file with the builder config, or - to read stdin",
4750
+ "name": "config-file",
4733
4751
  "hasDynamicHelp": false,
4734
4752
  "multiple": false,
4735
4753
  "type": "option"
4736
- },
4737
- "start": {
4738
- "description": "Activate the rule",
4739
- "exclusive": [
4740
- "stop"
4741
- ],
4742
- "name": "start",
4743
- "allowNo": false,
4744
- "type": "boolean"
4745
- },
4746
- "stop": {
4747
- "description": "Stop the rule and clear its next run",
4748
- "exclusive": [
4749
- "start"
4750
- ],
4751
- "name": "stop",
4752
- "allowNo": false,
4753
- "type": "boolean"
4754
4754
  }
4755
4755
  },
4756
4756
  "hasDynamicHelp": false,
4757
4757
  "hiddenAliases": [],
4758
- "id": "asa:automations:update",
4758
+ "id": "flows:config:validate",
4759
4759
  "pluginAlias": "adapty",
4760
4760
  "pluginName": "adapty",
4761
4761
  "pluginType": "core",
@@ -4765,9 +4765,9 @@
4765
4765
  "relativePath": [
4766
4766
  "dist",
4767
4767
  "commands",
4768
- "asa",
4769
- "automations",
4770
- "update.js"
4768
+ "flows",
4769
+ "config",
4770
+ "validate.js"
4771
4771
  ]
4772
4772
  },
4773
4773
  "flows:media:upload": {
@@ -4818,5 +4818,5 @@
4818
4818
  ]
4819
4819
  }
4820
4820
  },
4821
- "version": "0.8.0-beta.0"
4821
+ "version": "0.8.1"
4822
4822
  }