adapty 0.8.0-beta.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/oclif.manifest.json +1454 -1454
  2. package/package.json +1 -1
@@ -656,6 +656,156 @@
656
656
  "whoami.js"
657
657
  ]
658
658
  },
659
+ "flows:create": {
660
+ "aliases": [],
661
+ "args": {},
662
+ "description": "Create a flow (row only — write its config with `flows config update`)",
663
+ "examples": [
664
+ "<%= config.bin %> flows create --app UUID --name \"Onboarding\""
665
+ ],
666
+ "flags": {
667
+ "json": {
668
+ "description": "Format output as json.",
669
+ "helpGroup": "GLOBAL",
670
+ "name": "json",
671
+ "allowNo": false,
672
+ "type": "boolean"
673
+ },
674
+ "app": {
675
+ "description": "App ID (UUID)",
676
+ "name": "app",
677
+ "required": true,
678
+ "hasDynamicHelp": false,
679
+ "multiple": false,
680
+ "type": "option"
681
+ },
682
+ "name": {
683
+ "description": "Flow name",
684
+ "name": "name",
685
+ "required": true,
686
+ "hasDynamicHelp": false,
687
+ "multiple": false,
688
+ "type": "option"
689
+ }
690
+ },
691
+ "hasDynamicHelp": false,
692
+ "hiddenAliases": [],
693
+ "id": "flows:create",
694
+ "pluginAlias": "adapty",
695
+ "pluginName": "adapty",
696
+ "pluginType": "core",
697
+ "strict": true,
698
+ "enableJsonFlag": true,
699
+ "isESM": true,
700
+ "relativePath": [
701
+ "dist",
702
+ "commands",
703
+ "flows",
704
+ "create.js"
705
+ ]
706
+ },
707
+ "flows:get": {
708
+ "aliases": [],
709
+ "args": {
710
+ "flow_id": {
711
+ "description": "Flow ID (UUID)",
712
+ "name": "flow_id",
713
+ "required": true
714
+ }
715
+ },
716
+ "description": "Get flow details",
717
+ "examples": [
718
+ "<%= config.bin %> flows get --app UUID 550e8400-e29b-41d4-a716-446655440000"
719
+ ],
720
+ "flags": {
721
+ "json": {
722
+ "description": "Format output as json.",
723
+ "helpGroup": "GLOBAL",
724
+ "name": "json",
725
+ "allowNo": false,
726
+ "type": "boolean"
727
+ },
728
+ "app": {
729
+ "description": "App ID (UUID)",
730
+ "name": "app",
731
+ "required": true,
732
+ "hasDynamicHelp": false,
733
+ "multiple": false,
734
+ "type": "option"
735
+ }
736
+ },
737
+ "hasDynamicHelp": false,
738
+ "hiddenAliases": [],
739
+ "id": "flows:get",
740
+ "pluginAlias": "adapty",
741
+ "pluginName": "adapty",
742
+ "pluginType": "core",
743
+ "strict": true,
744
+ "enableJsonFlag": true,
745
+ "isESM": true,
746
+ "relativePath": [
747
+ "dist",
748
+ "commands",
749
+ "flows",
750
+ "get.js"
751
+ ]
752
+ },
753
+ "flows:list": {
754
+ "aliases": [],
755
+ "args": {},
756
+ "description": "List flows for an app",
757
+ "examples": [
758
+ "<%= config.bin %> flows list --app 550e8400-..."
759
+ ],
760
+ "flags": {
761
+ "json": {
762
+ "description": "Format output as json.",
763
+ "helpGroup": "GLOBAL",
764
+ "name": "json",
765
+ "allowNo": false,
766
+ "type": "boolean"
767
+ },
768
+ "app": {
769
+ "description": "App ID (UUID)",
770
+ "name": "app",
771
+ "required": true,
772
+ "hasDynamicHelp": false,
773
+ "multiple": false,
774
+ "type": "option"
775
+ },
776
+ "page": {
777
+ "description": "Page number",
778
+ "name": "page",
779
+ "default": 1,
780
+ "hasDynamicHelp": false,
781
+ "multiple": false,
782
+ "type": "option"
783
+ },
784
+ "page-size": {
785
+ "description": "Items per page (max 100)",
786
+ "name": "page-size",
787
+ "default": 20,
788
+ "hasDynamicHelp": false,
789
+ "multiple": false,
790
+ "type": "option"
791
+ }
792
+ },
793
+ "hasDynamicHelp": false,
794
+ "hiddenAliases": [],
795
+ "id": "flows:list",
796
+ "pluginAlias": "adapty",
797
+ "pluginName": "adapty",
798
+ "pluginType": "core",
799
+ "strict": true,
800
+ "enableJsonFlag": true,
801
+ "isESM": true,
802
+ "relativePath": [
803
+ "dist",
804
+ "commands",
805
+ "flows",
806
+ "list.js"
807
+ ]
808
+ },
659
809
  "paywalls:create": {
660
810
  "aliases": [],
661
811
  "args": {},
@@ -922,18 +1072,13 @@
922
1072
  "update.js"
923
1073
  ]
924
1074
  },
925
- "segments:get": {
1075
+ "placements:create": {
926
1076
  "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",
1077
+ "args": {},
1078
+ "description": "Create a placement with a paywall",
935
1079
  "examples": [
936
- "<%= config.bin %> segments get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1080
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1081
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
937
1082
  ],
938
1083
  "flags": {
939
1084
  "json": {
@@ -950,11 +1095,41 @@
950
1095
  "hasDynamicHelp": false,
951
1096
  "multiple": false,
952
1097
  "type": "option"
1098
+ },
1099
+ "audiences": {
1100
+ "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1101
+ "name": "audiences",
1102
+ "hasDynamicHelp": false,
1103
+ "multiple": false,
1104
+ "type": "option"
1105
+ },
1106
+ "developer-id": {
1107
+ "description": "Developer ID for the placement",
1108
+ "name": "developer-id",
1109
+ "required": true,
1110
+ "hasDynamicHelp": false,
1111
+ "multiple": false,
1112
+ "type": "option"
1113
+ },
1114
+ "paywall-id": {
1115
+ "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1116
+ "name": "paywall-id",
1117
+ "hasDynamicHelp": false,
1118
+ "multiple": false,
1119
+ "type": "option"
1120
+ },
1121
+ "title": {
1122
+ "description": "Placement title",
1123
+ "name": "title",
1124
+ "required": true,
1125
+ "hasDynamicHelp": false,
1126
+ "multiple": false,
1127
+ "type": "option"
953
1128
  }
954
1129
  },
955
1130
  "hasDynamicHelp": false,
956
1131
  "hiddenAliases": [],
957
- "id": "segments:get",
1132
+ "id": "placements:create",
958
1133
  "pluginAlias": "adapty",
959
1134
  "pluginName": "adapty",
960
1135
  "pluginType": "core",
@@ -964,16 +1139,22 @@
964
1139
  "relativePath": [
965
1140
  "dist",
966
1141
  "commands",
967
- "segments",
968
- "get.js"
1142
+ "placements",
1143
+ "create.js"
969
1144
  ]
970
1145
  },
971
- "segments:list": {
1146
+ "placements:get": {
972
1147
  "aliases": [],
973
- "args": {},
974
- "description": "List segments for an app",
1148
+ "args": {
1149
+ "placement_id": {
1150
+ "description": "Placement ID (UUID)",
1151
+ "name": "placement_id",
1152
+ "required": true
1153
+ }
1154
+ },
1155
+ "description": "Get placement details",
975
1156
  "examples": [
976
- "<%= config.bin %> segments list --app 550e8400-..."
1157
+ "<%= config.bin %> placements get --app UUID 550e8400-e29b-41d4-a716-446655440000"
977
1158
  ],
978
1159
  "flags": {
979
1160
  "json": {
@@ -990,27 +1171,11 @@
990
1171
  "hasDynamicHelp": false,
991
1172
  "multiple": false,
992
1173
  "type": "option"
993
- },
994
- "page": {
995
- "description": "Page number",
996
- "name": "page",
997
- "default": 1,
998
- "hasDynamicHelp": false,
999
- "multiple": false,
1000
- "type": "option"
1001
- },
1002
- "page-size": {
1003
- "description": "Items per page (max 100)",
1004
- "name": "page-size",
1005
- "default": 20,
1006
- "hasDynamicHelp": false,
1007
- "multiple": false,
1008
- "type": "option"
1009
1174
  }
1010
1175
  },
1011
1176
  "hasDynamicHelp": false,
1012
1177
  "hiddenAliases": [],
1013
- "id": "segments:list",
1178
+ "id": "placements:get",
1014
1179
  "pluginAlias": "adapty",
1015
1180
  "pluginName": "adapty",
1016
1181
  "pluginType": "core",
@@ -1020,16 +1185,16 @@
1020
1185
  "relativePath": [
1021
1186
  "dist",
1022
1187
  "commands",
1023
- "segments",
1024
- "list.js"
1188
+ "placements",
1189
+ "get.js"
1025
1190
  ]
1026
1191
  },
1027
- "products:create": {
1192
+ "placements:list": {
1028
1193
  "aliases": [],
1029
1194
  "args": {},
1030
- "description": "Create a product with vendor products per platform",
1195
+ "description": "List placements for an app",
1031
1196
  "examples": [
1032
- "<%= config.bin %> products create --app UUID --title \"Monthly\" --access-level-id UUID --period monthly --ios-product-id com.example.monthly"
1197
+ "<%= config.bin %> placements list --app 550e8400-..."
1033
1198
  ],
1034
1199
  "flags": {
1035
1200
  "json": {
@@ -1047,19 +1212,152 @@
1047
1212
  "multiple": false,
1048
1213
  "type": "option"
1049
1214
  },
1050
- "access-level-id": {
1051
- "description": "Access level ID (UUID)",
1052
- "name": "access-level-id",
1053
- "required": true,
1215
+ "page": {
1216
+ "description": "Page number",
1217
+ "name": "page",
1218
+ "default": 1,
1054
1219
  "hasDynamicHelp": false,
1055
1220
  "multiple": false,
1056
1221
  "type": "option"
1057
1222
  },
1058
- "android-base-plan-id": {
1059
- "description": "Android base plan ID",
1060
- "helpGroup": "STORE BINDINGS",
1061
- "name": "android-base-plan-id",
1062
- "hasDynamicHelp": false,
1223
+ "page-size": {
1224
+ "description": "Items per page (max 100)",
1225
+ "name": "page-size",
1226
+ "default": 20,
1227
+ "hasDynamicHelp": false,
1228
+ "multiple": false,
1229
+ "type": "option"
1230
+ }
1231
+ },
1232
+ "hasDynamicHelp": false,
1233
+ "hiddenAliases": [],
1234
+ "id": "placements:list",
1235
+ "pluginAlias": "adapty",
1236
+ "pluginName": "adapty",
1237
+ "pluginType": "core",
1238
+ "strict": true,
1239
+ "enableJsonFlag": true,
1240
+ "isESM": true,
1241
+ "relativePath": [
1242
+ "dist",
1243
+ "commands",
1244
+ "placements",
1245
+ "list.js"
1246
+ ]
1247
+ },
1248
+ "placements:update": {
1249
+ "aliases": [],
1250
+ "args": {
1251
+ "placement_id": {
1252
+ "description": "Placement ID (UUID)",
1253
+ "name": "placement_id",
1254
+ "required": true
1255
+ }
1256
+ },
1257
+ "description": "Update a placement",
1258
+ "examples": [
1259
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1260
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
1261
+ ],
1262
+ "flags": {
1263
+ "json": {
1264
+ "description": "Format output as json.",
1265
+ "helpGroup": "GLOBAL",
1266
+ "name": "json",
1267
+ "allowNo": false,
1268
+ "type": "boolean"
1269
+ },
1270
+ "app": {
1271
+ "description": "App ID (UUID)",
1272
+ "name": "app",
1273
+ "required": true,
1274
+ "hasDynamicHelp": false,
1275
+ "multiple": false,
1276
+ "type": "option"
1277
+ },
1278
+ "audiences": {
1279
+ "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1280
+ "name": "audiences",
1281
+ "hasDynamicHelp": false,
1282
+ "multiple": false,
1283
+ "type": "option"
1284
+ },
1285
+ "developer-id": {
1286
+ "description": "Developer ID for the placement",
1287
+ "name": "developer-id",
1288
+ "required": true,
1289
+ "hasDynamicHelp": false,
1290
+ "multiple": false,
1291
+ "type": "option"
1292
+ },
1293
+ "paywall-id": {
1294
+ "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1295
+ "name": "paywall-id",
1296
+ "hasDynamicHelp": false,
1297
+ "multiple": false,
1298
+ "type": "option"
1299
+ },
1300
+ "title": {
1301
+ "description": "Placement title",
1302
+ "name": "title",
1303
+ "required": true,
1304
+ "hasDynamicHelp": false,
1305
+ "multiple": false,
1306
+ "type": "option"
1307
+ }
1308
+ },
1309
+ "hasDynamicHelp": false,
1310
+ "hiddenAliases": [],
1311
+ "id": "placements:update",
1312
+ "pluginAlias": "adapty",
1313
+ "pluginName": "adapty",
1314
+ "pluginType": "core",
1315
+ "strict": true,
1316
+ "enableJsonFlag": true,
1317
+ "isESM": true,
1318
+ "relativePath": [
1319
+ "dist",
1320
+ "commands",
1321
+ "placements",
1322
+ "update.js"
1323
+ ]
1324
+ },
1325
+ "products:create": {
1326
+ "aliases": [],
1327
+ "args": {},
1328
+ "description": "Create a product with vendor products per platform",
1329
+ "examples": [
1330
+ "<%= config.bin %> products create --app UUID --title \"Monthly\" --access-level-id UUID --period monthly --ios-product-id com.example.monthly"
1331
+ ],
1332
+ "flags": {
1333
+ "json": {
1334
+ "description": "Format output as json.",
1335
+ "helpGroup": "GLOBAL",
1336
+ "name": "json",
1337
+ "allowNo": false,
1338
+ "type": "boolean"
1339
+ },
1340
+ "app": {
1341
+ "description": "App ID (UUID)",
1342
+ "name": "app",
1343
+ "required": true,
1344
+ "hasDynamicHelp": false,
1345
+ "multiple": false,
1346
+ "type": "option"
1347
+ },
1348
+ "access-level-id": {
1349
+ "description": "Access level ID (UUID)",
1350
+ "name": "access-level-id",
1351
+ "required": true,
1352
+ "hasDynamicHelp": false,
1353
+ "multiple": false,
1354
+ "type": "option"
1355
+ },
1356
+ "android-base-plan-id": {
1357
+ "description": "Android base plan ID",
1358
+ "helpGroup": "STORE BINDINGS",
1359
+ "name": "android-base-plan-id",
1360
+ "hasDynamicHelp": false,
1063
1361
  "multiple": false,
1064
1362
  "type": "option"
1065
1363
  },
@@ -1308,66 +1606,18 @@
1308
1606
  "update.js"
1309
1607
  ]
1310
1608
  },
1311
- "flows:create": {
1312
- "aliases": [],
1313
- "args": {},
1314
- "description": "Create a flow (row only — write its config with `flows config update`)",
1315
- "examples": [
1316
- "<%= config.bin %> flows create --app UUID --name \"Onboarding\""
1317
- ],
1318
- "flags": {
1319
- "json": {
1320
- "description": "Format output as json.",
1321
- "helpGroup": "GLOBAL",
1322
- "name": "json",
1323
- "allowNo": false,
1324
- "type": "boolean"
1325
- },
1326
- "app": {
1327
- "description": "App ID (UUID)",
1328
- "name": "app",
1329
- "required": true,
1330
- "hasDynamicHelp": false,
1331
- "multiple": false,
1332
- "type": "option"
1333
- },
1334
- "name": {
1335
- "description": "Flow name",
1336
- "name": "name",
1337
- "required": true,
1338
- "hasDynamicHelp": false,
1339
- "multiple": false,
1340
- "type": "option"
1341
- }
1342
- },
1343
- "hasDynamicHelp": false,
1344
- "hiddenAliases": [],
1345
- "id": "flows:create",
1346
- "pluginAlias": "adapty",
1347
- "pluginName": "adapty",
1348
- "pluginType": "core",
1349
- "strict": true,
1350
- "enableJsonFlag": true,
1351
- "isESM": true,
1352
- "relativePath": [
1353
- "dist",
1354
- "commands",
1355
- "flows",
1356
- "create.js"
1357
- ]
1358
- },
1359
- "flows:get": {
1609
+ "segments:get": {
1360
1610
  "aliases": [],
1361
1611
  "args": {
1362
- "flow_id": {
1363
- "description": "Flow ID (UUID)",
1364
- "name": "flow_id",
1612
+ "segment_id": {
1613
+ "description": "Segment ID (UUID)",
1614
+ "name": "segment_id",
1365
1615
  "required": true
1366
1616
  }
1367
1617
  },
1368
- "description": "Get flow details",
1618
+ "description": "Get segment details",
1369
1619
  "examples": [
1370
- "<%= config.bin %> flows get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1620
+ "<%= config.bin %> segments get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1371
1621
  ],
1372
1622
  "flags": {
1373
1623
  "json": {
@@ -1388,7 +1638,7 @@
1388
1638
  },
1389
1639
  "hasDynamicHelp": false,
1390
1640
  "hiddenAliases": [],
1391
- "id": "flows:get",
1641
+ "id": "segments:get",
1392
1642
  "pluginAlias": "adapty",
1393
1643
  "pluginName": "adapty",
1394
1644
  "pluginType": "core",
@@ -1398,16 +1648,16 @@
1398
1648
  "relativePath": [
1399
1649
  "dist",
1400
1650
  "commands",
1401
- "flows",
1651
+ "segments",
1402
1652
  "get.js"
1403
1653
  ]
1404
1654
  },
1405
- "flows:list": {
1655
+ "segments:list": {
1406
1656
  "aliases": [],
1407
1657
  "args": {},
1408
- "description": "List flows for an app",
1658
+ "description": "List segments for an app",
1409
1659
  "examples": [
1410
- "<%= config.bin %> flows list --app 550e8400-..."
1660
+ "<%= config.bin %> segments list --app 550e8400-..."
1411
1661
  ],
1412
1662
  "flags": {
1413
1663
  "json": {
@@ -1444,7 +1694,7 @@
1444
1694
  },
1445
1695
  "hasDynamicHelp": false,
1446
1696
  "hiddenAliases": [],
1447
- "id": "flows:list",
1697
+ "id": "segments:list",
1448
1698
  "pluginAlias": "adapty",
1449
1699
  "pluginName": "adapty",
1450
1700
  "pluginType": "core",
@@ -1454,17 +1704,17 @@
1454
1704
  "relativePath": [
1455
1705
  "dist",
1456
1706
  "commands",
1457
- "flows",
1707
+ "segments",
1458
1708
  "list.js"
1459
1709
  ]
1460
1710
  },
1461
- "placements:create": {
1711
+ "asa:ad-groups:create": {
1462
1712
  "aliases": [],
1463
1713
  "args": {},
1464
- "description": "Create a placement with a paywall",
1714
+ "description": "Create an ad group inside a campaign",
1465
1715
  "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"
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"
1468
1718
  ],
1469
1719
  "flags": {
1470
1720
  "json": {
@@ -1474,288 +1724,38 @@
1474
1724
  "allowNo": false,
1475
1725
  "type": "boolean"
1476
1726
  },
1477
- "app": {
1478
- "description": "App ID (UUID)",
1479
- "name": "app",
1480
- "required": true,
1727
+ "currency": {
1728
+ "description": "Currency code for the amounts in this call",
1729
+ "name": "currency",
1730
+ "default": "USD",
1481
1731
  "hasDynamicHelp": false,
1482
1732
  "multiple": false,
1483
1733
  "type": "option"
1484
1734
  },
1485
- "audiences": {
1486
- "description": "JSON array of audience entries: [{segment_ids, paywall_id, priority}]",
1487
- "name": "audiences",
1735
+ "end-time": {
1736
+ "description": "Schedule end (YYYY-MM-DD)",
1737
+ "name": "end-time",
1488
1738
  "hasDynamicHelp": false,
1489
1739
  "multiple": false,
1490
1740
  "type": "option"
1491
1741
  },
1492
- "developer-id": {
1493
- "description": "Developer ID for the placement",
1494
- "name": "developer-id",
1495
- "required": true,
1742
+ "start-time": {
1743
+ "description": "Schedule start (YYYY-MM-DD), defaults to today",
1744
+ "name": "start-time",
1496
1745
  "hasDynamicHelp": false,
1497
1746
  "multiple": false,
1498
1747
  "type": "option"
1499
1748
  },
1500
- "paywall-id": {
1501
- "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1502
- "name": "paywall-id",
1749
+ "pricing-model": {
1750
+ "description": "Pricing model; Apple requires one on every ad group",
1751
+ "name": "pricing-model",
1752
+ "default": "CPC",
1503
1753
  "hasDynamicHelp": false,
1504
1754
  "multiple": false,
1505
- "type": "option"
1506
- },
1507
- "title": {
1508
- "description": "Placement title",
1509
- "name": "title",
1510
- "required": true,
1511
- "hasDynamicHelp": false,
1512
- "multiple": false,
1513
- "type": "option"
1514
- }
1515
- },
1516
- "hasDynamicHelp": false,
1517
- "hiddenAliases": [],
1518
- "id": "placements:create",
1519
- "pluginAlias": "adapty",
1520
- "pluginName": "adapty",
1521
- "pluginType": "core",
1522
- "strict": true,
1523
- "enableJsonFlag": true,
1524
- "isESM": true,
1525
- "relativePath": [
1526
- "dist",
1527
- "commands",
1528
- "placements",
1529
- "create.js"
1530
- ]
1531
- },
1532
- "placements:get": {
1533
- "aliases": [],
1534
- "args": {
1535
- "placement_id": {
1536
- "description": "Placement ID (UUID)",
1537
- "name": "placement_id",
1538
- "required": true
1539
- }
1540
- },
1541
- "description": "Get placement details",
1542
- "examples": [
1543
- "<%= config.bin %> placements get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1544
- ],
1545
- "flags": {
1546
- "json": {
1547
- "description": "Format output as json.",
1548
- "helpGroup": "GLOBAL",
1549
- "name": "json",
1550
- "allowNo": false,
1551
- "type": "boolean"
1552
- },
1553
- "app": {
1554
- "description": "App ID (UUID)",
1555
- "name": "app",
1556
- "required": true,
1557
- "hasDynamicHelp": false,
1558
- "multiple": false,
1559
- "type": "option"
1560
- }
1561
- },
1562
- "hasDynamicHelp": false,
1563
- "hiddenAliases": [],
1564
- "id": "placements:get",
1565
- "pluginAlias": "adapty",
1566
- "pluginName": "adapty",
1567
- "pluginType": "core",
1568
- "strict": true,
1569
- "enableJsonFlag": true,
1570
- "isESM": true,
1571
- "relativePath": [
1572
- "dist",
1573
- "commands",
1574
- "placements",
1575
- "get.js"
1576
- ]
1577
- },
1578
- "placements:list": {
1579
- "aliases": [],
1580
- "args": {},
1581
- "description": "List placements for an app",
1582
- "examples": [
1583
- "<%= config.bin %> placements list --app 550e8400-..."
1584
- ],
1585
- "flags": {
1586
- "json": {
1587
- "description": "Format output as json.",
1588
- "helpGroup": "GLOBAL",
1589
- "name": "json",
1590
- "allowNo": false,
1591
- "type": "boolean"
1592
- },
1593
- "app": {
1594
- "description": "App ID (UUID)",
1595
- "name": "app",
1596
- "required": true,
1597
- "hasDynamicHelp": false,
1598
- "multiple": false,
1599
- "type": "option"
1600
- },
1601
- "page": {
1602
- "description": "Page number",
1603
- "name": "page",
1604
- "default": 1,
1605
- "hasDynamicHelp": false,
1606
- "multiple": false,
1607
- "type": "option"
1608
- },
1609
- "page-size": {
1610
- "description": "Items per page (max 100)",
1611
- "name": "page-size",
1612
- "default": 20,
1613
- "hasDynamicHelp": false,
1614
- "multiple": false,
1615
- "type": "option"
1616
- }
1617
- },
1618
- "hasDynamicHelp": false,
1619
- "hiddenAliases": [],
1620
- "id": "placements:list",
1621
- "pluginAlias": "adapty",
1622
- "pluginName": "adapty",
1623
- "pluginType": "core",
1624
- "strict": true,
1625
- "enableJsonFlag": true,
1626
- "isESM": true,
1627
- "relativePath": [
1628
- "dist",
1629
- "commands",
1630
- "placements",
1631
- "list.js"
1632
- ]
1633
- },
1634
- "placements:update": {
1635
- "aliases": [],
1636
- "args": {
1637
- "placement_id": {
1638
- "description": "Placement ID (UUID)",
1639
- "name": "placement_id",
1640
- "required": true
1641
- }
1642
- },
1643
- "description": "Update a placement",
1644
- "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"
1647
- ],
1648
- "flags": {
1649
- "json": {
1650
- "description": "Format output as json.",
1651
- "helpGroup": "GLOBAL",
1652
- "name": "json",
1653
- "allowNo": false,
1654
- "type": "boolean"
1655
- },
1656
- "app": {
1657
- "description": "App ID (UUID)",
1658
- "name": "app",
1659
- "required": true,
1660
- "hasDynamicHelp": false,
1661
- "multiple": false,
1662
- "type": "option"
1663
- },
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",
1674
- "required": true,
1675
- "hasDynamicHelp": false,
1676
- "multiple": false,
1677
- "type": "option"
1678
- },
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
- "title": {
1687
- "description": "Placement title",
1688
- "name": "title",
1689
- "required": true,
1690
- "hasDynamicHelp": false,
1691
- "multiple": false,
1692
- "type": "option"
1693
- }
1694
- },
1695
- "hasDynamicHelp": false,
1696
- "hiddenAliases": [],
1697
- "id": "placements:update",
1698
- "pluginAlias": "adapty",
1699
- "pluginName": "adapty",
1700
- "pluginType": "core",
1701
- "strict": true,
1702
- "enableJsonFlag": true,
1703
- "isESM": true,
1704
- "relativePath": [
1705
- "dist",
1706
- "commands",
1707
- "placements",
1708
- "update.js"
1709
- ]
1710
- },
1711
- "asa:ad-groups:create": {
1712
- "aliases": [],
1713
- "args": {},
1714
- "description": "Create an ad group inside a campaign",
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"
1718
- ],
1719
- "flags": {
1720
- "json": {
1721
- "description": "Format output as json.",
1722
- "helpGroup": "GLOBAL",
1723
- "name": "json",
1724
- "allowNo": false,
1725
- "type": "boolean"
1726
- },
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
- ],
1755
+ "options": [
1756
+ "CPC",
1757
+ "CPM"
1758
+ ],
1759
1759
  "type": "option"
1760
1760
  },
1761
1761
  "yes": {
@@ -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,62 @@
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,
2457
+ }
2458
+ },
2459
+ "hasDynamicHelp": false,
2460
+ "hiddenAliases": [],
2461
+ "id": "asa:automations:create",
2462
+ "pluginAlias": "adapty",
2463
+ "pluginName": "adapty",
2464
+ "pluginType": "core",
2465
+ "strict": true,
2466
+ "enableJsonFlag": true,
2467
+ "isESM": true,
2468
+ "relativePath": [
2469
+ "dist",
2470
+ "commands",
2471
+ "asa",
2472
+ "automations",
2473
+ "create.js"
2474
+ ]
2475
+ },
2476
+ "asa:automations:get": {
2477
+ "aliases": [],
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",
2486
+ "examples": [
2487
+ "<%= config.bin %> asa automations get 550e8400-e29b-41d4-a716-446655440000"
2488
+ ],
2489
+ "flags": {
2490
+ "json": {
2491
+ "description": "Format output as json.",
2492
+ "helpGroup": "GLOBAL",
2493
+ "name": "json",
2494
+ "allowNo": false,
2493
2495
  "type": "boolean"
2494
2496
  }
2495
2497
  },
2496
2498
  "hasDynamicHelp": false,
2497
2499
  "hiddenAliases": [],
2498
- "id": "asa:campaigns:bulk-create",
2500
+ "id": "asa:automations:get",
2499
2501
  "pluginAlias": "adapty",
2500
2502
  "pluginName": "adapty",
2501
2503
  "pluginType": "core",
@@ -2506,18 +2508,16 @@
2506
2508
  "dist",
2507
2509
  "commands",
2508
2510
  "asa",
2509
- "campaigns",
2510
- "bulk-create.js"
2511
+ "automations",
2512
+ "get.js"
2511
2513
  ]
2512
2514
  },
2513
- "asa:campaigns:bulk-list": {
2515
+ "asa:automations:list": {
2514
2516
  "aliases": [],
2515
2517
  "args": {},
2516
- "description": "This company's bulk operations, newest first; inspect one with bulk-status",
2518
+ "description": "List automation rules; status 1 is active, 0 is stopped",
2517
2519
  "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"
2520
+ "<%= config.bin %> asa automations list"
2521
2521
  ],
2522
2522
  "flags": {
2523
2523
  "json": {
@@ -2542,46 +2542,71 @@
2542
2542
  "hasDynamicHelp": false,
2543
2543
  "multiple": false,
2544
2544
  "type": "option"
2545
+ }
2546
+ },
2547
+ "hasDynamicHelp": false,
2548
+ "hiddenAliases": [],
2549
+ "id": "asa:automations:list",
2550
+ "pluginAlias": "adapty",
2551
+ "pluginName": "adapty",
2552
+ "pluginType": "core",
2553
+ "strict": true,
2554
+ "enableJsonFlag": true,
2555
+ "isESM": true,
2556
+ "relativePath": [
2557
+ "dist",
2558
+ "commands",
2559
+ "asa",
2560
+ "automations",
2561
+ "list.js"
2562
+ ]
2563
+ },
2564
+ "asa:automations:run": {
2565
+ "aliases": [],
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",
2574
+ "examples": [
2575
+ "<%= config.bin %> asa automations run UUID",
2576
+ "<%= config.bin %> asa automations run UUID --dry-run"
2577
+ ],
2578
+ "flags": {
2579
+ "json": {
2580
+ "description": "Format output as json.",
2581
+ "helpGroup": "GLOBAL",
2582
+ "name": "json",
2583
+ "allowNo": false,
2584
+ "type": "boolean"
2545
2585
  },
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"
2586
+ "yes": {
2587
+ "char": "y",
2588
+ "description": "Apply without asking; required when the output is piped or --json is used",
2589
+ "name": "yes",
2590
+ "allowNo": false,
2591
+ "type": "boolean"
2559
2592
  },
2560
- "created-to": {
2561
- "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
2562
- "name": "created-to",
2593
+ "idempotency-key": {
2594
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
2595
+ "name": "idempotency-key",
2563
2596
  "hasDynamicHelp": false,
2564
2597
  "multiple": false,
2565
2598
  "type": "option"
2566
2599
  },
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"
2600
+ "dry-run": {
2601
+ "description": "Evaluate and log the rule without touching Apple",
2602
+ "name": "dry-run",
2603
+ "allowNo": false,
2604
+ "type": "boolean"
2580
2605
  }
2581
2606
  },
2582
2607
  "hasDynamicHelp": false,
2583
2608
  "hiddenAliases": [],
2584
- "id": "asa:campaigns:bulk-list",
2609
+ "id": "asa:automations:run",
2585
2610
  "pluginAlias": "adapty",
2586
2611
  "pluginName": "adapty",
2587
2612
  "pluginType": "core",
@@ -2592,22 +2617,22 @@
2592
2617
  "dist",
2593
2618
  "commands",
2594
2619
  "asa",
2595
- "campaigns",
2596
- "bulk-list.js"
2620
+ "automations",
2621
+ "run.js"
2597
2622
  ]
2598
2623
  },
2599
- "asa:campaigns:bulk-status": {
2624
+ "asa:automations:runs": {
2600
2625
  "aliases": [],
2601
2626
  "args": {
2602
- "operation-id": {
2603
- "description": "Bulk operation ID returned by bulk-create",
2604
- "name": "operation-id",
2627
+ "automation_id": {
2628
+ "description": "Automation rule ID (UUID)",
2629
+ "name": "automation_id",
2605
2630
  "required": true
2606
2631
  }
2607
2632
  },
2608
- "description": "Progress board of one bulk operation: counts, pipelines and the per-object log",
2633
+ "description": "List past runs of an automation rule, including dry runs",
2609
2634
  "examples": [
2610
- "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
2635
+ "<%= config.bin %> asa automations runs 550e8400-e29b-41d4-a716-446655440000"
2611
2636
  ],
2612
2637
  "flags": {
2613
2638
  "json": {
@@ -2636,7 +2661,7 @@
2636
2661
  },
2637
2662
  "hasDynamicHelp": false,
2638
2663
  "hiddenAliases": [],
2639
- "id": "asa:campaigns:bulk-status",
2664
+ "id": "asa:automations:runs",
2640
2665
  "pluginAlias": "adapty",
2641
2666
  "pluginName": "adapty",
2642
2667
  "pluginType": "core",
@@ -2647,16 +2672,23 @@
2647
2672
  "dist",
2648
2673
  "commands",
2649
2674
  "asa",
2650
- "campaigns",
2651
- "bulk-status.js"
2675
+ "automations",
2676
+ "runs.js"
2652
2677
  ]
2653
2678
  },
2654
- "asa:campaigns:create": {
2679
+ "asa:automations:update": {
2655
2680
  "aliases": [],
2656
- "args": {},
2657
- "description": "Create a campaign in Apple Search Ads",
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",
2658
2689
  "examples": [
2659
- "<%= config.bin %> asa campaigns create --org UUID --name \"Winter push\" --adam-id 123456 --country US --daily-budget 50"
2690
+ "<%= config.bin %> asa automations update UUID --stop",
2691
+ "<%= config.bin %> asa automations update UUID --file rule.json"
2660
2692
  ],
2661
2693
  "flags": {
2662
2694
  "json": {
@@ -2666,14 +2698,6 @@
2666
2698
  "allowNo": false,
2667
2699
  "type": "boolean"
2668
2700
  },
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
2701
  "yes": {
2678
2702
  "char": "y",
2679
2703
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2688,159 +2712,42 @@
2688
2712
  "multiple": false,
2689
2713
  "type": "option"
2690
2714
  },
2691
- "ad-channel-type": {
2692
- "description": "Ad channel type",
2693
- "name": "ad-channel-type",
2694
- "default": "SEARCH",
2715
+ "file": {
2716
+ "description": "JSON file with the parts to change, or - to read stdin",
2717
+ "name": "file",
2695
2718
  "hasDynamicHelp": false,
2696
2719
  "multiple": false,
2697
- "options": [
2698
- "DISPLAY",
2699
- "SEARCH"
2700
- ],
2701
2720
  "type": "option"
2702
2721
  },
2703
- "adam-id": {
2704
- "description": "App Store app ID (adam_id)",
2705
- "name": "adam-id",
2706
- "required": true,
2722
+ "name": {
2723
+ "description": "Rule name",
2724
+ "name": "name",
2707
2725
  "hasDynamicHelp": false,
2708
2726
  "multiple": false,
2709
2727
  "type": "option"
2710
2728
  },
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"
2729
+ "start": {
2730
+ "description": "Activate the rule",
2731
+ "exclusive": [
2732
+ "stop"
2781
2733
  ],
2782
- "type": "option"
2734
+ "name": "start",
2735
+ "allowNo": false,
2736
+ "type": "boolean"
2783
2737
  },
2784
- "supply-source": {
2785
- "description": "Supply source, repeatable",
2786
- "name": "supply-source",
2787
- "default": [
2788
- "APPSTORE_SEARCH_RESULTS"
2738
+ "stop": {
2739
+ "description": "Stop the rule and clear its next run",
2740
+ "exclusive": [
2741
+ "start"
2789
2742
  ],
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"
2800
- }
2801
- },
2802
- "hasDynamicHelp": false,
2803
- "hiddenAliases": [],
2804
- "id": "asa:campaigns:create",
2805
- "pluginAlias": "adapty",
2806
- "pluginName": "adapty",
2807
- "pluginType": "core",
2808
- "strict": true,
2809
- "enableJsonFlag": true,
2810
- "isESM": true,
2811
- "relativePath": [
2812
- "dist",
2813
- "commands",
2814
- "asa",
2815
- "campaigns",
2816
- "create.js"
2817
- ]
2818
- },
2819
- "asa:campaigns:get": {
2820
- "aliases": [],
2821
- "args": {
2822
- "campaign_id": {
2823
- "description": "Campaign ID (UUID)",
2824
- "name": "campaign_id",
2825
- "required": true
2826
- }
2827
- },
2828
- "description": "Show one campaign; read numbers with asa metrics",
2829
- "examples": [
2830
- "<%= config.bin %> asa campaigns get 550e8400-e29b-41d4-a716-446655440000"
2831
- ],
2832
- "flags": {
2833
- "json": {
2834
- "description": "Format output as json.",
2835
- "helpGroup": "GLOBAL",
2836
- "name": "json",
2743
+ "name": "stop",
2837
2744
  "allowNo": false,
2838
2745
  "type": "boolean"
2839
2746
  }
2840
2747
  },
2841
2748
  "hasDynamicHelp": false,
2842
2749
  "hiddenAliases": [],
2843
- "id": "asa:campaigns:get",
2750
+ "id": "asa:automations:update",
2844
2751
  "pluginAlias": "adapty",
2845
2752
  "pluginName": "adapty",
2846
2753
  "pluginType": "core",
@@ -2851,17 +2758,16 @@
2851
2758
  "dist",
2852
2759
  "commands",
2853
2760
  "asa",
2854
- "campaigns",
2855
- "get.js"
2761
+ "automations",
2762
+ "update.js"
2856
2763
  ]
2857
2764
  },
2858
- "asa:campaigns:list": {
2765
+ "asa:competitors:summary": {
2859
2766
  "aliases": [],
2860
2767
  "args": {},
2861
- "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
2768
+ "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
2862
2769
  "examples": [
2863
- "<%= config.bin %> asa campaigns list",
2864
- "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
2770
+ "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
2865
2771
  ],
2866
2772
  "flags": {
2867
2773
  "json": {
@@ -2871,58 +2777,18 @@
2871
2777
  "allowNo": false,
2872
2778
  "type": "boolean"
2873
2779
  },
2874
- "page": {
2875
- "description": "Page number",
2876
- "name": "page",
2877
- "default": 1,
2878
- "hasDynamicHelp": false,
2879
- "multiple": false,
2880
- "type": "option"
2881
- },
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,
2886
- "hasDynamicHelp": false,
2887
- "multiple": false,
2888
- "type": "option"
2889
- },
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",
2900
- "hasDynamicHelp": false,
2901
- "multiple": true,
2902
- "type": "option"
2903
- },
2904
- "search": {
2905
- "description": "Case-insensitive substring match on the name",
2906
- "name": "search",
2907
- "hasDynamicHelp": false,
2908
- "multiple": false,
2909
- "type": "option"
2910
- },
2911
- "status": {
2912
- "description": "Keep only rows in this state",
2913
- "name": "status",
2780
+ "app-ids": {
2781
+ "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
2782
+ "name": "app-ids",
2783
+ "required": true,
2914
2784
  "hasDynamicHelp": false,
2915
2785
  "multiple": false,
2916
- "options": [
2917
- "ENABLED",
2918
- "PAUSED"
2919
- ],
2920
2786
  "type": "option"
2921
2787
  }
2922
2788
  },
2923
2789
  "hasDynamicHelp": false,
2924
2790
  "hiddenAliases": [],
2925
- "id": "asa:campaigns:list",
2791
+ "id": "asa:competitors:summary",
2926
2792
  "pluginAlias": "adapty",
2927
2793
  "pluginName": "adapty",
2928
2794
  "pluginType": "core",
@@ -2933,23 +2799,19 @@
2933
2799
  "dist",
2934
2800
  "commands",
2935
2801
  "asa",
2936
- "campaigns",
2937
- "list.js"
2802
+ "competitors",
2803
+ "summary.js"
2938
2804
  ]
2939
2805
  },
2940
- "asa:campaigns:update": {
2806
+ "asa:campaigns:bulk-create": {
2941
2807
  "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",
2808
+ "args": {},
2809
+ "description": "Create a whole campaign structure (campaigns → ad groups → keywords/negative keywords/ads) in one bulk operation",
2950
2810
  "examples": [
2951
- "<%= config.bin %> asa campaigns update UUID --status PAUSED",
2952
- "<%= config.bin %> asa campaigns update UUID --daily-budget 80"
2811
+ "<%= config.bin %> asa campaigns bulk-create --file structure.json",
2812
+ "cat structure.json | <%= config.bin %> asa campaigns bulk-create --file -",
2813
+ "<%= config.bin %> asa campaigns bulk-create --from-file Campaign_And_Adgroup_Template.xlsx --org-id 1234567",
2814
+ "<%= config.bin %> asa campaigns bulk-create --from-file keywords_template.csv --org-id 1234567 --preview"
2953
2815
  ],
2954
2816
  "flags": {
2955
2817
  "json": {
@@ -2959,14 +2821,6 @@
2959
2821
  "allowNo": false,
2960
2822
  "type": "boolean"
2961
2823
  },
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
2824
  "yes": {
2971
2825
  "char": "y",
2972
2826
  "description": "Apply without asking; required when the output is piped or --json is used",
@@ -2981,67 +2835,59 @@
2981
2835
  "multiple": false,
2982
2836
  "type": "option"
2983
2837
  },
2984
- "bidding-strategy": {
2985
- "description": "Bidding strategy",
2986
- "name": "bidding-strategy",
2838
+ "file": {
2839
+ "description": "JSON file with the campaign structure (the POST /bulk-operations/ body); use \"-\" for stdin",
2840
+ "name": "file",
2987
2841
  "hasDynamicHelp": false,
2988
2842
  "multiple": false,
2989
- "options": [
2990
- "MANUAL_CPT",
2991
- "MAX_CONVERSIONS"
2992
- ],
2993
2843
  "type": "option"
2994
2844
  },
2995
- "budget": {
2996
- "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
2997
- "name": "budget",
2845
+ "from-file": {
2846
+ "description": "Apple Ads bulk template (Campaign_And_Adgroup_Template.xlsx or keywords .csv) to convert and submit",
2847
+ "name": "from-file",
2998
2848
  "hasDynamicHelp": false,
2999
2849
  "multiple": false,
3000
2850
  "type": "option"
3001
2851
  },
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",
2852
+ "org-id": {
2853
+ "description": "Apple org id (campaign_group_id) the converted template will target; required with --from-file",
2854
+ "name": "org-id",
3012
2855
  "hasDynamicHelp": false,
3013
2856
  "multiple": false,
3014
2857
  "type": "option"
3015
2858
  },
3016
- "name": {
3017
- "description": "Campaign name",
3018
- "name": "name",
2859
+ "poll-interval": {
2860
+ "description": "Seconds between progress polls",
2861
+ "name": "poll-interval",
2862
+ "default": 5,
3019
2863
  "hasDynamicHelp": false,
3020
2864
  "multiple": false,
3021
2865
  "type": "option"
3022
2866
  },
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"
2867
+ "preview": {
2868
+ "description": "With --from-file: print the converted request and stop, nothing is created",
2869
+ "name": "preview",
2870
+ "allowNo": false,
2871
+ "type": "boolean"
3033
2872
  },
3034
- "target-cpa": {
3035
- "description": "Target CPA (amount, e.g. 50 or 12.50)",
3036
- "name": "target-cpa",
2873
+ "timeout": {
2874
+ "description": "Max seconds to wait for the operation to finish",
2875
+ "name": "timeout",
2876
+ "default": 900,
3037
2877
  "hasDynamicHelp": false,
3038
2878
  "multiple": false,
3039
2879
  "type": "option"
2880
+ },
2881
+ "wait": {
2882
+ "description": "Poll the operation until it finishes; --no-wait returns the operation id immediately",
2883
+ "name": "wait",
2884
+ "allowNo": true,
2885
+ "type": "boolean"
3040
2886
  }
3041
2887
  },
3042
2888
  "hasDynamicHelp": false,
3043
2889
  "hiddenAliases": [],
3044
- "id": "asa:campaigns:update",
2890
+ "id": "asa:campaigns:bulk-create",
3045
2891
  "pluginAlias": "adapty",
3046
2892
  "pluginName": "adapty",
3047
2893
  "pluginType": "core",
@@ -3053,16 +2899,17 @@
3053
2899
  "commands",
3054
2900
  "asa",
3055
2901
  "campaigns",
3056
- "update.js"
2902
+ "bulk-create.js"
3057
2903
  ]
3058
2904
  },
3059
- "asa:creatives:list": {
2905
+ "asa:campaigns:bulk-list": {
3060
2906
  "aliases": [],
3061
2907
  "args": {},
3062
- "description": "List creatives; creative_id is what `asa ads create` needs",
2908
+ "description": "This company's bulk operations, newest first; inspect one with bulk-status",
3063
2909
  "examples": [
3064
- "<%= config.bin %> asa creatives list",
3065
- "<%= config.bin %> asa creatives list --app APP_UUID"
2910
+ "<%= config.bin %> asa campaigns bulk-list",
2911
+ "<%= config.bin %> asa campaigns bulk-list --status partial --status failed",
2912
+ "<%= config.bin %> asa campaigns bulk-list --created-from 2026-08-01 --created-to 2026-08-20"
3066
2913
  ],
3067
2914
  "flags": {
3068
2915
  "json": {
@@ -3089,23 +2936,44 @@
3089
2936
  "type": "option"
3090
2937
  },
3091
2938
  "app": {
3092
- "description": "Keep only rows in this app; repeatable",
2939
+ "description": "Keep only operations of this app (UUID)",
3093
2940
  "name": "app",
3094
2941
  "hasDynamicHelp": false,
3095
- "multiple": true,
2942
+ "multiple": false,
3096
2943
  "type": "option"
3097
2944
  },
3098
- "campaign-group": {
3099
- "description": "Keep only rows in this campaign group; repeatable",
3100
- "name": "campaign-group",
2945
+ "created-from": {
2946
+ "description": "Keep only operations created on or after this date (YYYY-MM-DD)",
2947
+ "name": "created-from",
2948
+ "hasDynamicHelp": false,
2949
+ "multiple": false,
2950
+ "type": "option"
2951
+ },
2952
+ "created-to": {
2953
+ "description": "Keep only operations created on or before this date (YYYY-MM-DD)",
2954
+ "name": "created-to",
2955
+ "hasDynamicHelp": false,
2956
+ "multiple": false,
2957
+ "type": "option"
2958
+ },
2959
+ "status": {
2960
+ "description": "Keep only operations in this state; repeatable",
2961
+ "name": "status",
3101
2962
  "hasDynamicHelp": false,
3102
2963
  "multiple": true,
2964
+ "options": [
2965
+ "failed",
2966
+ "partial",
2967
+ "pending",
2968
+ "running",
2969
+ "success"
2970
+ ],
3103
2971
  "type": "option"
3104
2972
  }
3105
2973
  },
3106
2974
  "hasDynamicHelp": false,
3107
2975
  "hiddenAliases": [],
3108
- "id": "asa:creatives:list",
2976
+ "id": "asa:campaigns:bulk-list",
3109
2977
  "pluginAlias": "adapty",
3110
2978
  "pluginName": "adapty",
3111
2979
  "pluginType": "core",
@@ -3116,16 +2984,22 @@
3116
2984
  "dist",
3117
2985
  "commands",
3118
2986
  "asa",
3119
- "creatives",
3120
- "list.js"
2987
+ "campaigns",
2988
+ "bulk-list.js"
3121
2989
  ]
3122
2990
  },
3123
- "asa:competitors:summary": {
2991
+ "asa:campaigns:bulk-status": {
3124
2992
  "aliases": [],
3125
- "args": {},
3126
- "description": "Competitor summary for up to five App Store apps; the server covers the last full month and every country",
2993
+ "args": {
2994
+ "operation-id": {
2995
+ "description": "Bulk operation ID returned by bulk-create",
2996
+ "name": "operation-id",
2997
+ "required": true
2998
+ }
2999
+ },
3000
+ "description": "Progress board of one bulk operation: counts, pipelines and the per-object log",
3127
3001
  "examples": [
3128
- "<%= config.bin %> asa competitors summary --app-ids 1668337467,6503873027"
3002
+ "<%= config.bin %> asa campaigns bulk-status 660e8400-e29b-41d4-a716-446655440001"
3129
3003
  ],
3130
3004
  "flags": {
3131
3005
  "json": {
@@ -3135,10 +3009,18 @@
3135
3009
  "allowNo": false,
3136
3010
  "type": "boolean"
3137
3011
  },
3138
- "app-ids": {
3139
- "description": "Apple App Store IDs (adam_id), comma-separated, 1-5 values",
3140
- "name": "app-ids",
3141
- "required": true,
3012
+ "page": {
3013
+ "description": "Page number",
3014
+ "name": "page",
3015
+ "default": 1,
3016
+ "hasDynamicHelp": false,
3017
+ "multiple": false,
3018
+ "type": "option"
3019
+ },
3020
+ "page-size": {
3021
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3022
+ "name": "page-size",
3023
+ "default": 100,
3142
3024
  "hasDynamicHelp": false,
3143
3025
  "multiple": false,
3144
3026
  "type": "option"
@@ -3146,7 +3028,7 @@
3146
3028
  },
3147
3029
  "hasDynamicHelp": false,
3148
3030
  "hiddenAliases": [],
3149
- "id": "asa:competitors:summary",
3031
+ "id": "asa:campaigns:bulk-status",
3150
3032
  "pluginAlias": "adapty",
3151
3033
  "pluginName": "adapty",
3152
3034
  "pluginType": "core",
@@ -3157,17 +3039,16 @@
3157
3039
  "dist",
3158
3040
  "commands",
3159
3041
  "asa",
3160
- "competitors",
3161
- "summary.js"
3042
+ "campaigns",
3043
+ "bulk-status.js"
3162
3044
  ]
3163
3045
  },
3164
- "asa:keywords:add": {
3046
+ "asa:campaigns:create": {
3165
3047
  "aliases": [],
3166
3048
  "args": {},
3167
- "description": "Add targeting keywords to an ad group",
3049
+ "description": "Create a campaign in Apple Search Ads",
3168
3050
  "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"
3051
+ "<%= config.bin %> asa campaigns create --org UUID --name \"Winter push\" --adam-id 123456 --country US --daily-budget 50"
3171
3052
  ],
3172
3053
  "flags": {
3173
3054
  "json": {
@@ -3199,63 +3080,120 @@
3199
3080
  "multiple": false,
3200
3081
  "type": "option"
3201
3082
  },
3202
- "ad-group": {
3203
- "description": "Ad group ID (UUID) — the campaign is resolved from it",
3204
- "name": "ad-group",
3205
- "required": true,
3083
+ "ad-channel-type": {
3084
+ "description": "Ad channel type",
3085
+ "name": "ad-channel-type",
3086
+ "default": "SEARCH",
3206
3087
  "hasDynamicHelp": false,
3207
3088
  "multiple": false,
3089
+ "options": [
3090
+ "DISPLAY",
3091
+ "SEARCH"
3092
+ ],
3208
3093
  "type": "option"
3209
3094
  },
3210
- "bid": {
3211
- "description": "Bid per keyword (amount, e.g. 50 or 12.50)",
3212
- "name": "bid",
3095
+ "adam-id": {
3096
+ "description": "App Store app ID (adam_id)",
3097
+ "name": "adam-id",
3098
+ "required": true,
3213
3099
  "hasDynamicHelp": false,
3214
3100
  "multiple": false,
3215
3101
  "type": "option"
3216
3102
  },
3217
- "from-file": {
3218
- "description": "File with one keyword per line, combined with any --text values",
3219
- "name": "from-file",
3103
+ "bidding-strategy": {
3104
+ "description": "Bidding strategy; Apple defaults to MANUAL_CPT when omitted",
3105
+ "name": "bidding-strategy",
3220
3106
  "hasDynamicHelp": false,
3221
3107
  "multiple": false,
3108
+ "options": [
3109
+ "MANUAL_CPT",
3110
+ "MAX_CONVERSIONS"
3111
+ ],
3222
3112
  "type": "option"
3223
3113
  },
3224
- "match-type": {
3225
- "description": "Match type",
3226
- "name": "match-type",
3227
- "default": "BROAD",
3114
+ "billing-event": {
3115
+ "description": "Billing event",
3116
+ "name": "billing-event",
3117
+ "default": "TAPS",
3228
3118
  "hasDynamicHelp": false,
3229
3119
  "multiple": false,
3230
3120
  "options": [
3231
- "BROAD",
3232
- "EXACT"
3121
+ "IMPRESSIONS",
3122
+ "TAPS"
3233
3123
  ],
3234
3124
  "type": "option"
3235
3125
  },
3126
+ "budget": {
3127
+ "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
3128
+ "name": "budget",
3129
+ "hasDynamicHelp": false,
3130
+ "multiple": false,
3131
+ "type": "option"
3132
+ },
3133
+ "country": {
3134
+ "description": "Country or region code, repeatable",
3135
+ "name": "country",
3136
+ "required": true,
3137
+ "hasDynamicHelp": false,
3138
+ "multiple": true,
3139
+ "type": "option"
3140
+ },
3141
+ "daily-budget": {
3142
+ "description": "Daily budget (amount, e.g. 50 or 12.50)",
3143
+ "name": "daily-budget",
3144
+ "required": true,
3145
+ "hasDynamicHelp": false,
3146
+ "multiple": false,
3147
+ "type": "option"
3148
+ },
3149
+ "name": {
3150
+ "description": "Campaign name",
3151
+ "name": "name",
3152
+ "required": true,
3153
+ "hasDynamicHelp": false,
3154
+ "multiple": false,
3155
+ "type": "option"
3156
+ },
3157
+ "org": {
3158
+ "description": "Campaign group ID (UUID) — see `adapty asa orgs list`",
3159
+ "name": "org",
3160
+ "required": true,
3161
+ "hasDynamicHelp": false,
3162
+ "multiple": false,
3163
+ "type": "option"
3164
+ },
3236
3165
  "status": {
3237
- "description": "Keyword status",
3166
+ "description": "Initial status",
3238
3167
  "name": "status",
3239
- "default": "ACTIVE",
3240
3168
  "hasDynamicHelp": false,
3241
3169
  "multiple": false,
3242
3170
  "options": [
3243
- "ACTIVE",
3171
+ "ENABLED",
3244
3172
  "PAUSED"
3245
3173
  ],
3246
3174
  "type": "option"
3247
3175
  },
3248
- "text": {
3249
- "description": "Keyword text, repeatable",
3250
- "name": "text",
3176
+ "supply-source": {
3177
+ "description": "Supply source, repeatable",
3178
+ "name": "supply-source",
3179
+ "default": [
3180
+ "APPSTORE_SEARCH_RESULTS"
3181
+ ],
3251
3182
  "hasDynamicHelp": false,
3252
3183
  "multiple": true,
3253
3184
  "type": "option"
3185
+ },
3186
+ "target-cpa": {
3187
+ "description": "Target CPA (amount, e.g. 50 or 12.50)",
3188
+ "name": "target-cpa",
3189
+ "hasDynamicHelp": false,
3190
+ "multiple": false,
3191
+ "type": "option"
3254
3192
  }
3255
3193
  },
3256
3194
  "hasDynamicHelp": false,
3257
3195
  "hiddenAliases": [],
3258
- "id": "asa:keywords:add",
3196
+ "id": "asa:campaigns:create",
3259
3197
  "pluginAlias": "adapty",
3260
3198
  "pluginName": "adapty",
3261
3199
  "pluginType": "core",
@@ -3266,17 +3204,22 @@
3266
3204
  "dist",
3267
3205
  "commands",
3268
3206
  "asa",
3269
- "keywords",
3270
- "add.js"
3207
+ "campaigns",
3208
+ "create.js"
3271
3209
  ]
3272
3210
  },
3273
- "asa:keywords:list": {
3211
+ "asa:campaigns:get": {
3274
3212
  "aliases": [],
3275
- "args": {},
3276
- "description": "List targeting keywords; read numbers with asa metrics",
3213
+ "args": {
3214
+ "campaign_id": {
3215
+ "description": "Campaign ID (UUID)",
3216
+ "name": "campaign_id",
3217
+ "required": true
3218
+ }
3219
+ },
3220
+ "description": "Show one campaign; read numbers with asa metrics",
3277
3221
  "examples": [
3278
- "<%= config.bin %> asa keywords list",
3279
- "<%= config.bin %> asa keywords list --ad-group AD_GROUP_UUID --status ACTIVE"
3222
+ "<%= config.bin %> asa campaigns get 550e8400-e29b-41d4-a716-446655440000"
3280
3223
  ],
3281
3224
  "flags": {
3282
3225
  "json": {
@@ -3285,73 +3228,11 @@
3285
3228
  "name": "json",
3286
3229
  "allowNo": false,
3287
3230
  "type": "boolean"
3288
- },
3289
- "page": {
3290
- "description": "Page number",
3291
- "name": "page",
3292
- "default": 1,
3293
- "hasDynamicHelp": false,
3294
- "multiple": false,
3295
- "type": "option"
3296
- },
3297
- "page-size": {
3298
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3299
- "name": "page-size",
3300
- "default": 100,
3301
- "hasDynamicHelp": false,
3302
- "multiple": false,
3303
- "type": "option"
3304
- },
3305
- "app": {
3306
- "description": "Keep only rows in this app; repeatable",
3307
- "name": "app",
3308
- "hasDynamicHelp": false,
3309
- "multiple": true,
3310
- "type": "option"
3311
- },
3312
- "campaign-group": {
3313
- "description": "Keep only rows in this campaign group; repeatable",
3314
- "name": "campaign-group",
3315
- "hasDynamicHelp": false,
3316
- "multiple": true,
3317
- "type": "option"
3318
- },
3319
- "search": {
3320
- "description": "Case-insensitive substring match on the name",
3321
- "name": "search",
3322
- "hasDynamicHelp": false,
3323
- "multiple": false,
3324
- "type": "option"
3325
- },
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
- "status": {
3341
- "description": "Keep only rows in this state",
3342
- "name": "status",
3343
- "hasDynamicHelp": false,
3344
- "multiple": false,
3345
- "options": [
3346
- "ACTIVE",
3347
- "PAUSED"
3348
- ],
3349
- "type": "option"
3350
3231
  }
3351
3232
  },
3352
3233
  "hasDynamicHelp": false,
3353
3234
  "hiddenAliases": [],
3354
- "id": "asa:keywords:list",
3235
+ "id": "asa:campaigns:get",
3355
3236
  "pluginAlias": "adapty",
3356
3237
  "pluginName": "adapty",
3357
3238
  "pluginType": "core",
@@ -3362,23 +3243,17 @@
3362
3243
  "dist",
3363
3244
  "commands",
3364
3245
  "asa",
3365
- "keywords",
3366
- "list.js"
3246
+ "campaigns",
3247
+ "get.js"
3367
3248
  ]
3368
3249
  },
3369
- "asa:keywords:update": {
3250
+ "asa:campaigns:list": {
3370
3251
  "aliases": [],
3371
- "args": {
3372
- "keyword_id": {
3373
- "description": "Keyword ID (UUID), repeatable as extra arguments",
3374
- "name": "keyword_id",
3375
- "required": true
3376
- }
3377
- },
3378
- "description": "Change bid, status, text or match type of keywords",
3252
+ "args": {},
3253
+ "description": "List Apple Search Ads campaigns; read numbers with asa metrics",
3379
3254
  "examples": [
3380
- "<%= config.bin %> asa keywords update UUID --bid 2.00",
3381
- "<%= config.bin %> asa keywords update UUID_A UUID_B --status PAUSED"
3255
+ "<%= config.bin %> asa campaigns list",
3256
+ "<%= config.bin %> asa campaigns list --app APP_UUID --status PAUSED"
3382
3257
  ],
3383
3258
  "flags": {
3384
3259
  "json": {
@@ -3388,92 +3263,85 @@
3388
3263
  "allowNo": false,
3389
3264
  "type": "boolean"
3390
3265
  },
3391
- "currency": {
3392
- "description": "Currency code for the amounts in this call",
3393
- "name": "currency",
3394
- "default": "USD",
3266
+ "page": {
3267
+ "description": "Page number",
3268
+ "name": "page",
3269
+ "default": 1,
3395
3270
  "hasDynamicHelp": false,
3396
3271
  "multiple": false,
3397
3272
  "type": "option"
3398
- },
3399
- "yes": {
3400
- "char": "y",
3401
- "description": "Apply without asking; required when the output is piped or --json is used",
3402
- "name": "yes",
3403
- "allowNo": false,
3404
- "type": "boolean"
3405
- },
3406
- "idempotency-key": {
3407
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3408
- "name": "idempotency-key",
3273
+ },
3274
+ "page-size": {
3275
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
3276
+ "name": "page-size",
3277
+ "default": 100,
3409
3278
  "hasDynamicHelp": false,
3410
3279
  "multiple": false,
3411
3280
  "type": "option"
3412
3281
  },
3413
- "bid": {
3414
- "description": "Bid (amount, e.g. 50 or 12.50)",
3415
- "name": "bid",
3282
+ "app": {
3283
+ "description": "Keep only rows in this app; repeatable",
3284
+ "name": "app",
3416
3285
  "hasDynamicHelp": false,
3417
- "multiple": false,
3286
+ "multiple": true,
3418
3287
  "type": "option"
3419
3288
  },
3420
- "match-type": {
3421
- "description": "Match type",
3422
- "name": "match-type",
3289
+ "campaign-group": {
3290
+ "description": "Keep only rows in this campaign group; repeatable",
3291
+ "name": "campaign-group",
3292
+ "hasDynamicHelp": false,
3293
+ "multiple": true,
3294
+ "type": "option"
3295
+ },
3296
+ "search": {
3297
+ "description": "Case-insensitive substring match on the name",
3298
+ "name": "search",
3423
3299
  "hasDynamicHelp": false,
3424
3300
  "multiple": false,
3425
- "options": [
3426
- "BROAD",
3427
- "EXACT"
3428
- ],
3429
3301
  "type": "option"
3430
3302
  },
3431
3303
  "status": {
3432
- "description": "Keyword status",
3304
+ "description": "Keep only rows in this state",
3433
3305
  "name": "status",
3434
3306
  "hasDynamicHelp": false,
3435
3307
  "multiple": false,
3436
3308
  "options": [
3437
- "ACTIVE",
3309
+ "ENABLED",
3438
3310
  "PAUSED"
3439
3311
  ],
3440
3312
  "type": "option"
3441
- },
3442
- "text": {
3443
- "description": "Keyword text (only meaningful for a single keyword)",
3444
- "name": "text",
3445
- "hasDynamicHelp": false,
3446
- "multiple": false,
3447
- "type": "option"
3448
3313
  }
3449
3314
  },
3450
3315
  "hasDynamicHelp": false,
3451
3316
  "hiddenAliases": [],
3452
- "id": "asa:keywords:update",
3317
+ "id": "asa:campaigns:list",
3453
3318
  "pluginAlias": "adapty",
3454
3319
  "pluginName": "adapty",
3455
3320
  "pluginType": "core",
3456
- "strict": false,
3321
+ "strict": true,
3457
3322
  "enableJsonFlag": true,
3458
3323
  "isESM": true,
3459
3324
  "relativePath": [
3460
3325
  "dist",
3461
3326
  "commands",
3462
3327
  "asa",
3463
- "keywords",
3464
- "update.js"
3328
+ "campaigns",
3329
+ "list.js"
3465
3330
  ]
3466
3331
  },
3467
- "asa:metrics": {
3332
+ "asa:campaigns:update": {
3468
3333
  "aliases": [],
3469
- "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.",
3334
+ "args": {
3335
+ "campaign_id": {
3336
+ "description": "Campaign ID (UUID)",
3337
+ "name": "campaign_id",
3338
+ "required": true
3339
+ }
3340
+ },
3341
+ "description": "Change a campaign: budgets, countries, status or schedule",
3471
3342
  "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"
3343
+ "<%= config.bin %> asa campaigns update UUID --status PAUSED",
3344
+ "<%= config.bin %> asa campaigns update UUID --daily-budget 80"
3477
3345
  ],
3478
3346
  "flags": {
3479
3347
  "json": {
@@ -3483,103 +3351,81 @@
3483
3351
  "allowNo": false,
3484
3352
  "type": "boolean"
3485
3353
  },
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,
3354
+ "currency": {
3355
+ "description": "Currency code for the amounts in this call",
3356
+ "name": "currency",
3357
+ "default": "USD",
3498
3358
  "hasDynamicHelp": false,
3499
3359
  "multiple": false,
3500
3360
  "type": "option"
3501
3361
  },
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"
3362
+ "yes": {
3363
+ "char": "y",
3364
+ "description": "Apply without asking; required when the output is piped or --json is used",
3365
+ "name": "yes",
3366
+ "allowNo": false,
3367
+ "type": "boolean"
3508
3368
  },
3509
- "date-from": {
3510
- "description": "Start of the period (YYYY-MM-DD)",
3511
- "name": "date-from",
3512
- "required": true,
3369
+ "idempotency-key": {
3370
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
3371
+ "name": "idempotency-key",
3513
3372
  "hasDynamicHelp": false,
3514
3373
  "multiple": false,
3515
3374
  "type": "option"
3516
3375
  },
3517
- "date-to": {
3518
- "description": "End of the period (YYYY-MM-DD)",
3519
- "name": "date-to",
3520
- "required": true,
3376
+ "bidding-strategy": {
3377
+ "description": "Bidding strategy",
3378
+ "name": "bidding-strategy",
3521
3379
  "hasDynamicHelp": false,
3522
3380
  "multiple": false,
3381
+ "options": [
3382
+ "MANUAL_CPT",
3383
+ "MAX_CONVERSIONS"
3384
+ ],
3523
3385
  "type": "option"
3524
3386
  },
3525
- "entity": {
3526
- "description": "What to report on",
3527
- "name": "entity",
3528
- "required": true,
3387
+ "budget": {
3388
+ "description": "Lifetime budget (amount, e.g. 50 or 12.50)",
3389
+ "name": "budget",
3529
3390
  "hasDynamicHelp": false,
3530
3391
  "multiple": false,
3531
- "options": [
3532
- "ad",
3533
- "ad-group",
3534
- "campaign",
3535
- "keyword"
3536
- ],
3537
3392
  "type": "option"
3538
3393
  },
3539
- "group-by": {
3540
- "description": "Break the rows down by a dimension, repeatable",
3541
- "name": "group-by",
3394
+ "country": {
3395
+ "description": "Replace the country list, repeatable",
3396
+ "name": "country",
3542
3397
  "hasDynamicHelp": false,
3543
3398
  "multiple": true,
3544
- "options": [
3545
- "country",
3546
- "day",
3547
- "month",
3548
- "quarter",
3549
- "week",
3550
- "year"
3551
- ],
3552
3399
  "type": "option"
3553
3400
  },
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",
3401
+ "daily-budget": {
3402
+ "description": "Daily budget (amount, e.g. 50 or 12.50)",
3403
+ "name": "daily-budget",
3557
3404
  "hasDynamicHelp": false,
3558
- "multiple": true,
3405
+ "multiple": false,
3559
3406
  "type": "option"
3560
3407
  },
3561
- "order": {
3562
- "description": "Sort direction",
3563
- "name": "order",
3564
- "default": "desc",
3408
+ "name": {
3409
+ "description": "Campaign name",
3410
+ "name": "name",
3565
3411
  "hasDynamicHelp": false,
3566
3412
  "multiple": false,
3567
- "options": [
3568
- "asc",
3569
- "desc"
3570
- ],
3571
3413
  "type": "option"
3572
3414
  },
3573
- "order-by": {
3574
- "description": "Metric or field to sort by; cohort metrics rank via their gross_/proceeds_/net_ names",
3575
- "name": "order-by",
3415
+ "status": {
3416
+ "description": "Campaign status",
3417
+ "name": "status",
3576
3418
  "hasDynamicHelp": false,
3577
3419
  "multiple": false,
3420
+ "options": [
3421
+ "ENABLED",
3422
+ "PAUSED"
3423
+ ],
3578
3424
  "type": "option"
3579
3425
  },
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",
3426
+ "target-cpa": {
3427
+ "description": "Target CPA (amount, e.g. 50 or 12.50)",
3428
+ "name": "target-cpa",
3583
3429
  "hasDynamicHelp": false,
3584
3430
  "multiple": false,
3585
3431
  "type": "option"
@@ -3587,7 +3433,7 @@
3587
3433
  },
3588
3434
  "hasDynamicHelp": false,
3589
3435
  "hiddenAliases": [],
3590
- "id": "asa:metrics",
3436
+ "id": "asa:campaigns:update",
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
+ "campaigns",
3448
+ "update.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 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.",
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.0"
4822
4822
  }