@soku-ai/cli 0.1.0-alpha.16 → 0.1.0-alpha.17
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.
- package/dist/commands/ads.d.ts +3 -0
- package/dist/commands/ads.d.ts.map +1 -1
- package/dist/commands/ads.js +373 -10
- package/dist/commands/ads.js.map +1 -1
- package/dist/generated/capabilities.json +527 -9
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/skills/soku/references/ads-write.md +48 -19
|
@@ -580,6 +580,90 @@
|
|
|
580
580
|
],
|
|
581
581
|
"output_shape": "{\"success\": true, \"message\": \"Added 5 campaign negative keyword(s)\", \"results\": [...]}"
|
|
582
582
|
},
|
|
583
|
+
{
|
|
584
|
+
"id": "action:ads/add_campaign_webpage_exclusion",
|
|
585
|
+
"namespace": "ads",
|
|
586
|
+
"action": "add_campaign_webpage_exclusion",
|
|
587
|
+
"description": "Exclude webpages (URL paths, page titles, content) from a Google campaign via negative WEBPAGE criteria; review-gated.",
|
|
588
|
+
"mode": "risk",
|
|
589
|
+
"platforms": [
|
|
590
|
+
"google"
|
|
591
|
+
],
|
|
592
|
+
"requires_review": true,
|
|
593
|
+
"freshness_kind": "synced",
|
|
594
|
+
"see_also": [
|
|
595
|
+
"action:ads/update_campaign",
|
|
596
|
+
"action:ads/add_campaign_negative_keywords",
|
|
597
|
+
"action:ads/gaql_search",
|
|
598
|
+
"action:_batch/submit"
|
|
599
|
+
],
|
|
600
|
+
"long_description": "Primary use:\nCreate negative WEBPAGE campaign criteria so Google will not send traffic to the given pages of the advertiser's own site. This is the prevention side of final URL expansion: with expansion enabled, Google may pick any page on the domain as the landing page, including one that is factually wrong for the campaign (documented failure: a livestock-vaccine campaign expanded onto pet-vaccine pages on the same domain — the ad copy looks perfectly correct and only the link is wrong).\n\nUse when:\n- A Performance Max / Search campaign has final URL expansion ON and only part of the site is appropriate for it.\n- The user wants specific URL paths, page titles, or content off-limits as landing pages.\n\nDo not use when:\n- The goal is to switch expansion off entirely. Use action:ads/update_campaign with asset_automation={'final_url_expansion': 'OPTED_OUT'} (a cleaner, campaign-wide control) — exclusions only narrow which pages expansion may use.\n- The goal is to block search queries rather than landing pages. Use action:ads/add_campaign_negative_keywords.\n- The platform is Meta or TikTok. Neither has WEBPAGE criteria.\n\nWorkflow:\n1. Identify the URL paths to exclude (from the site structure or the campaign's expansion behaviour).\n2. Submit via action:_batch/submit for HITL review.\n3. Verify via action:ads/gaql_search on campaign_criterion where type = 'WEBPAGE'.\n\nOutput semantics:\n- Top-level envelope: see Cross-cutting envelope in capabilities-api.md.\n- raw.message reports the count created; raw.exclusions echoes the resolved criterion_name + conditions per criterion.\n\nSide effects:\n- One campaign_criterion_operation.create per exclusion, negative=True, all in one mutate.\n- Conditions WITHIN one exclusion are AND-ed by Google. To express alternatives, pass several entries in 'exclusions' (one criterion each).\n- An empty condition list is rejected: to Google it means the entire site, which as a negative criterion would exclude every page.\n- Reversible only via the Google Ads UI or a raw criterion remove; this capability set has no WEBPAGE remove handler.",
|
|
601
|
+
"input_params": [
|
|
602
|
+
{
|
|
603
|
+
"name": "platform",
|
|
604
|
+
"type": "string",
|
|
605
|
+
"required": true,
|
|
606
|
+
"description": "Supported platforms: google.",
|
|
607
|
+
"example": "google",
|
|
608
|
+
"enum": [
|
|
609
|
+
"google"
|
|
610
|
+
],
|
|
611
|
+
"source": "constant"
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"name": "account_id",
|
|
615
|
+
"type": "string",
|
|
616
|
+
"required": true,
|
|
617
|
+
"description": "Account id from ads.list_ad_accounts.rows[].account_id. For Google, digits only without dashes.",
|
|
618
|
+
"example": "1234567890",
|
|
619
|
+
"source": "upstream:action:ads/list_ad_accounts"
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
"name": "campaign_id",
|
|
623
|
+
"type": "string",
|
|
624
|
+
"required": true,
|
|
625
|
+
"description": "Campaign id from action:ads/list_campaigns.",
|
|
626
|
+
"example": "123456",
|
|
627
|
+
"source": "upstream:action:ads/list_campaigns"
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
"name": "conditions",
|
|
631
|
+
"type": "list",
|
|
632
|
+
"required": false,
|
|
633
|
+
"description": "Single-criterion shorthand: list (or JSON string) of conditions, AND-ed together. Each entry is either a bare string (shorthand for operand=URL, operator=CONTAINS) or an object {operand, operator, argument}. operand one of URL, CATEGORY, PAGE_TITLE, PAGE_CONTENT, CUSTOM_LABEL; operator one of EQUALS, CONTAINS (omit operator for non-string operands). Supply either this or 'exclusions'.",
|
|
634
|
+
"example": [
|
|
635
|
+
"/pet-vaccines"
|
|
636
|
+
],
|
|
637
|
+
"one_of_group": "webpage_exclusion_shape",
|
|
638
|
+
"source": "user"
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
"name": "exclusions",
|
|
642
|
+
"type": "list",
|
|
643
|
+
"required": false,
|
|
644
|
+
"description": "Multi-criterion form: list (or JSON string) of {criterion_name, conditions} objects, one negative WEBPAGE criterion each. Use this when the exclusions are alternatives rather than a single AND-ed condition set. Supply either this or 'conditions'.",
|
|
645
|
+
"example": [
|
|
646
|
+
{
|
|
647
|
+
"criterion_name": "Pet pages",
|
|
648
|
+
"conditions": [
|
|
649
|
+
"/pet-vaccines"
|
|
650
|
+
]
|
|
651
|
+
}
|
|
652
|
+
],
|
|
653
|
+
"one_of_group": "webpage_exclusion_shape",
|
|
654
|
+
"source": "user"
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
"name": "criterion_name",
|
|
658
|
+
"type": "string",
|
|
659
|
+
"required": false,
|
|
660
|
+
"description": "Optional label for the criterion built from the 'conditions' shorthand. Google requires a name on create; one is derived from the conditions when omitted.",
|
|
661
|
+
"example": "Pet vaccine pages",
|
|
662
|
+
"source": "user"
|
|
663
|
+
}
|
|
664
|
+
],
|
|
665
|
+
"output_shape": "{\"success\": true, \"message\": \"Added 1 campaign webpage exclusion(s)\", \"exclusions\": [{\"criterion_name\": \"Pet pages\", \"conditions\": [{\"operand\": \"URL\", \"operator\": \"CONTAINS\", \"argument\": \"/pet-vaccines\"}]}], \"results\": [{\"campaignCriterionResult\": {\"resourceName\": \"...\"}}]}"
|
|
666
|
+
},
|
|
583
667
|
{
|
|
584
668
|
"id": "action:ads/add_conversion_group_rule",
|
|
585
669
|
"namespace": "ads",
|
|
@@ -1274,6 +1358,146 @@
|
|
|
1274
1358
|
],
|
|
1275
1359
|
"output_shape": "{\"success\": true}"
|
|
1276
1360
|
},
|
|
1361
|
+
{
|
|
1362
|
+
"id": "action:ads/audit_ad_automation_inventory",
|
|
1363
|
+
"namespace": "ads",
|
|
1364
|
+
"action": "audit_ad_automation_inventory",
|
|
1365
|
+
"description": "Read-only paginated TikTok, Google, Meta, or ChatGPT Ads audit of every automation baseline currently tracked for one brand-scoped ad account.",
|
|
1366
|
+
"mode": "read",
|
|
1367
|
+
"platforms": [
|
|
1368
|
+
"google",
|
|
1369
|
+
"meta",
|
|
1370
|
+
"tiktok",
|
|
1371
|
+
"chatgpt_ads"
|
|
1372
|
+
],
|
|
1373
|
+
"requires_review": false,
|
|
1374
|
+
"freshness_kind": "realtime",
|
|
1375
|
+
"see_also": [
|
|
1376
|
+
"action:ads/list_ad_accounts",
|
|
1377
|
+
"action:ads/enable_ad_automation_audits"
|
|
1378
|
+
],
|
|
1379
|
+
"long_description": "Primary use:\nAudit every stored automation baseline in a brand-scoped ad account against fresh Google, Meta, TikTok, or ChatGPT Ads provider state.\n\nUse when:\n- A scheduled or manual audit needs full current-state coverage.\n- New baselines must be discovered without editing an existing Automation.\n\nDo not use when:\n- Establishing or changing an approved baseline; use preview_automation_baseline followed by establish_automation_baseline.\n- Mutating provider settings. This action is strictly read-only.\n\nWorkflow:\n1. Resolve the brand-scoped account and page its current snapshot inventory.\n2. Fresh-read every entity through its platform adapter and compare it with the authoritative baseline.\n3. Continue with next_after_id when returned. Scheduled brand-wide runs handle this pagination internally.\n4. If audit_schedule_required is true, submit enable_ad_automation_audits for HITL approval.\n\nOutput semantics:\n- account_disconnected means the account is no longer connected; entity_deleted means the provider returned not found. Neither state deletes the stored baseline.\n- results contains per-entity OK, DRIFTED, or NO_BASELINE findings; next_after_id is the stable continuation cursor.\n- audit_schedule_required reports whether either canonical recurring schedule is missing.\n\nSide effects:\n- None. The action performs provider reads and local baseline reads only.",
|
|
1380
|
+
"input_params": [
|
|
1381
|
+
{
|
|
1382
|
+
"name": "platform",
|
|
1383
|
+
"type": "string",
|
|
1384
|
+
"required": true,
|
|
1385
|
+
"description": "google, meta, tiktok, or chatgpt_ads.",
|
|
1386
|
+
"example": "google",
|
|
1387
|
+
"enum": [
|
|
1388
|
+
"google",
|
|
1389
|
+
"meta",
|
|
1390
|
+
"tiktok",
|
|
1391
|
+
"chatgpt_ads"
|
|
1392
|
+
],
|
|
1393
|
+
"source": "constant"
|
|
1394
|
+
},
|
|
1395
|
+
{
|
|
1396
|
+
"name": "account_id",
|
|
1397
|
+
"type": "string",
|
|
1398
|
+
"required": true,
|
|
1399
|
+
"description": "Brand-scoped ad account id from list_ad_accounts.",
|
|
1400
|
+
"example": "1234567890",
|
|
1401
|
+
"source": "upstream:action:ads/list_ad_accounts"
|
|
1402
|
+
},
|
|
1403
|
+
{
|
|
1404
|
+
"name": "after_id",
|
|
1405
|
+
"type": "integer",
|
|
1406
|
+
"required": false,
|
|
1407
|
+
"description": "Stable snapshot cursor returned as next_after_id.",
|
|
1408
|
+
"example": 100,
|
|
1409
|
+
"source": "upstream:action:ads/audit_ad_automation_inventory"
|
|
1410
|
+
},
|
|
1411
|
+
{
|
|
1412
|
+
"name": "limit",
|
|
1413
|
+
"type": "integer",
|
|
1414
|
+
"required": false,
|
|
1415
|
+
"description": "Snapshot page size from 1 through 500; defaults to 100.",
|
|
1416
|
+
"example": 100,
|
|
1417
|
+
"source": "constant"
|
|
1418
|
+
}
|
|
1419
|
+
],
|
|
1420
|
+
"output_shape": "{\"success\":true,\"account_status\":\"connected|account_disconnected\",\"results\":[{\"entity_id\":\"...\",\"findings\":[...]}],\"next_after_id\":123|null,\"read_only\":true,\"audit_schedule_required\":true|false,\"audit_schedule_recovery_action\":{\"action\":\"enable_ad_automation_audits\"}|null}\nTikTok output: uses the same account-scoped inventory envelope."
|
|
1421
|
+
},
|
|
1422
|
+
{
|
|
1423
|
+
"id": "action:ads/audit_creative_automation",
|
|
1424
|
+
"namespace": "ads",
|
|
1425
|
+
"action": "audit_creative_automation",
|
|
1426
|
+
"description": "Read-only drift audit: compare a Meta creative's or Google campaign's live AI-automation settings against the approved intent baseline.",
|
|
1427
|
+
"mode": "read",
|
|
1428
|
+
"platforms": [
|
|
1429
|
+
"google",
|
|
1430
|
+
"meta"
|
|
1431
|
+
],
|
|
1432
|
+
"requires_review": false,
|
|
1433
|
+
"freshness_kind": "realtime",
|
|
1434
|
+
"see_also": [
|
|
1435
|
+
"action:ads/update_campaign",
|
|
1436
|
+
"action:ads/create_ad_creative",
|
|
1437
|
+
"action:ads/get_campaign"
|
|
1438
|
+
],
|
|
1439
|
+
"long_description": "Primary use:\nDetect platform AI-automation settings that no longer match what was approved — toggles that flipped back on, or settings reset by duplicating a campaign/placement.\n\nUse when:\n- The user asks whether AI enhancements / asset automation are still configured the way they were approved.\n- A campaign or placement was duplicated (duplication resets automation settings on the copy).\n- A periodic re-check is due. Settings can change after a correct write, so a single check at write time does not stay true.\n\nDo not use when:\n- The user wants to CHANGE a setting. This action never writes; use action:ads/update_campaign (google asset_automation) or action:ads/create_ad_creative (meta creative_features) instead.\n- The user wants Meta's own recommendations. Use action:ads/get_opportunity_score.\n\nWorkflow:\n1. platform=meta: pass creative_id (from action:ads/list_ad_creatives or action:ads/get_ad_creatives). platform=google: pass campaign_id (from action:ads/list_campaigns).\n2. Pass the recorded intent baseline for that entity as `baseline` ({expected, source, captured_at}). Omit it only when no baseline exists.\n3. Read findings[]: act on status=DRIFTED, and treat status=NO_BASELINE as 'establish a baseline first', NOT as a violation.\n\nOutput semantics:\n- freshness=realtime: the read goes straight to the platform, so findings reflect the current value, not a synced snapshot.\n- STRICTLY READ-ONLY. No platform write is issued on any path, so it is safe to re-run on live spending accounts as often as needed.\n- findings[].status is one of OK | DRIFTED | NO_BASELINE. NO_BASELINE is reported SEPARATELY from DRIFTED on purpose: without a recorded baseline nothing can be said about whether the value changed, and reporting such assets as drifted would false-alarm on all pre-existing inventory.\n- findings[] covers EVERY feature/automation type the platform returned, not only the three Meta features Soku opts out of by default. Do not conclude from a short list that 'everything is disabled' — most features keep their platform default (usually ON) unless explicitly opted out.\n- An expected feature the platform did not return appears with actual=null; a disappeared setting matters as much as a flipped one.\n- baseline_source=soku_write is authoritative (Soku performed the write, so the baseline IS the approved configuration). baseline_source=human_baseline is NOT: an operator confirmed the CURRENT state was acceptable at baseline_captured_at, on inventory Soku did not write. That asset may already have drifted before the baseline was taken and the original intent is unknowable, so those findings carry baseline_disclaimer and baseline_authoritative=false. Never report a human_baseline finding to the user as if it were the originally approved state.\n- meta: standard_enhancements / standard_enhancements_catalog appear in GET responses even though writing them fails since Graph v22 (read/write asymmetry). Seeing them in this audit is normal, NOT an anomaly; they are listed under read_write_asymmetric_features.\n- meta: music is not part of creative_features_spec at all. music_opt_out_observed reads asset_feed_spec.audios instead (true = empty audios = opted out, null = no asset_feed_spec, so unknown).\n- google: unrecognized_types lists automation types the platform returned that this build does not model; they are reported rather than hidden.",
|
|
1440
|
+
"input_params": [
|
|
1441
|
+
{
|
|
1442
|
+
"name": "platform",
|
|
1443
|
+
"type": "string",
|
|
1444
|
+
"required": true,
|
|
1445
|
+
"description": "Supported platforms: google, meta.",
|
|
1446
|
+
"example": "meta",
|
|
1447
|
+
"enum": [
|
|
1448
|
+
"google",
|
|
1449
|
+
"meta"
|
|
1450
|
+
],
|
|
1451
|
+
"source": "constant"
|
|
1452
|
+
},
|
|
1453
|
+
{
|
|
1454
|
+
"name": "account_id",
|
|
1455
|
+
"type": "string",
|
|
1456
|
+
"required": true,
|
|
1457
|
+
"description": "Ad account id (Meta) / customer id (Google) from ads.list_ad_accounts.rows[].account_id.",
|
|
1458
|
+
"example": "1234567890",
|
|
1459
|
+
"source": "upstream:action:ads/list_ad_accounts"
|
|
1460
|
+
},
|
|
1461
|
+
{
|
|
1462
|
+
"name": "creative_id",
|
|
1463
|
+
"type": "string",
|
|
1464
|
+
"required": false,
|
|
1465
|
+
"description": "Meta only, required when platform=meta: AdCreative id to audit. Source: output of action:ads/list_ad_creatives or action:ads/get_ad_creatives.",
|
|
1466
|
+
"example": "120210000000000000",
|
|
1467
|
+
"source": "upstream:action:ads/list_ad_creatives,action:ads/get_ad_creatives",
|
|
1468
|
+
"platform": [
|
|
1469
|
+
"meta"
|
|
1470
|
+
]
|
|
1471
|
+
},
|
|
1472
|
+
{
|
|
1473
|
+
"name": "campaign_id",
|
|
1474
|
+
"type": "string",
|
|
1475
|
+
"required": false,
|
|
1476
|
+
"description": "Google only, required when platform=google: campaign id whose asset_automation_settings are audited. Source: output of action:ads/list_campaigns.",
|
|
1477
|
+
"example": "12345678901",
|
|
1478
|
+
"source": "upstream:action:ads/list_campaigns",
|
|
1479
|
+
"platform": [
|
|
1480
|
+
"google"
|
|
1481
|
+
]
|
|
1482
|
+
},
|
|
1483
|
+
{
|
|
1484
|
+
"name": "baseline",
|
|
1485
|
+
"type": "object",
|
|
1486
|
+
"required": false,
|
|
1487
|
+
"description": "The approved intent this audit diffs the live state against: {'expected': {...}, 'source': 'soku_write'|'human_baseline', 'captured_at': ISO-8601}. `expected` is the platform-native shape — Meta: the creative_features_spec map (or the whole degrees_of_freedom_spec wrapper); Google: the asset_automation_settings list or a type->status map. Omitting it means NO baseline: every observed feature is reported NO_BASELINE and nothing is reported as DRIFTED, so the audit can only say what the current state is, not whether it changed. Source: the ad automation intent snapshot recorded for this entity.",
|
|
1488
|
+
"example": {
|
|
1489
|
+
"expected": {
|
|
1490
|
+
"image_touchups": {
|
|
1491
|
+
"enroll_status": "OPT_OUT"
|
|
1492
|
+
}
|
|
1493
|
+
},
|
|
1494
|
+
"source": "soku_write",
|
|
1495
|
+
"captured_at": "2026-07-29T10:00:00Z"
|
|
1496
|
+
}
|
|
1497
|
+
}
|
|
1498
|
+
],
|
|
1499
|
+
"output_shape": "{\"success\": true, \"platform\": \"meta\", \"entity_type\": \"creative\", \"entity_id\": \"...\", \"baseline_source\": \"soku_write|human_baseline|null\", \"baseline_captured_at\": \"...|null\", \"baseline_authoritative\": true, \"read_only\": true, \"findings\": [{\"feature\": \"image_touchups\", \"expected\": {\"enroll_status\": \"OPT_OUT\"}, \"actual\": {\"enroll_status\": \"OPT_IN\"}, \"status\": \"DRIFTED\", \"baseline_source\": \"soku_write\", \"baseline_captured_at\": \"...\", \"baseline_authoritative\": true}], \"summary\": {\"ok\": 1, \"drifted\": 1, \"no_baseline\": 3, \"observed_features\": 5}} // status=NO_BASELINE findings carry `note` instead of baseline_* fields; human_baseline findings additionally carry `baseline_disclaimer` (the baseline is an operator-confirmed CURRENT state, not the originally approved one). meta adds creative_name / unrecognized_features / read_write_asymmetric_features / default_opt_out_features / music_opt_out_observed; google adds campaign_level_enum_names / unrecognized_types. No platform write is issued on any path."
|
|
1500
|
+
},
|
|
1277
1501
|
{
|
|
1278
1502
|
"id": "action:ads/bind_conversion_group_goal",
|
|
1279
1503
|
"namespace": "ads",
|
|
@@ -2145,9 +2369,9 @@
|
|
|
2145
2369
|
{
|
|
2146
2370
|
"name": "name",
|
|
2147
2371
|
"type": "string",
|
|
2148
|
-
"required":
|
|
2149
|
-
"description": "Meta only (required): the ad name. Required by the registry and by Meta's Ad node create contract. Source: user-provided ad name. ChatGPT Ads:
|
|
2150
|
-
"example": "
|
|
2372
|
+
"required": true,
|
|
2373
|
+
"description": "Meta only (required): the ad name. Required by the registry and by Meta's Ad node create contract. Source: user-provided ad name. ChatGPT Ads: Required non-empty authored Ad name used for provider persistence and reconciliation.",
|
|
2374
|
+
"example": "Research_workflow_01",
|
|
2151
2375
|
"platform": [
|
|
2152
2376
|
"meta",
|
|
2153
2377
|
"chatgpt_ads"
|
|
@@ -2689,6 +2913,29 @@
|
|
|
2689
2913
|
]
|
|
2690
2914
|
},
|
|
2691
2915
|
"source": "user"
|
|
2916
|
+
},
|
|
2917
|
+
{
|
|
2918
|
+
"name": "creative_features",
|
|
2919
|
+
"type": "object",
|
|
2920
|
+
"required": false,
|
|
2921
|
+
"description": "Meta only: opt in/out of Meta's AI creative enhancements, mapping feature name -> OPT_IN | OPT_OUT (or {'enroll_status': 'OPT_OUT'}). 69 features are accepted. THREE are OPTED OUT BY DEFAULT even when this parameter is omitted, because Meta enables them silently and they rewrite approved creative: add_text_overlay, image_touchups, text_optimizations. Pass OPT_IN explicitly to re-enable one. The other 66 are controllable but inherit Meta's own default, so omitting them is NOT the same as disabling them. Feature names carry three confidence tiers: 42 appear in both Meta's reference page and its SDK, 4 only in the docs (generate_cta, text_extraction_for_headline, text_extraction_for_tap_target, translate_voiceover), and 23 only in the SDK (e.g. image_enhancement, video_auto_crop, text_generation) — for those last two tiers per-account availability is unverified, so a platform-side rejection is expected rather than a bug. REJECTED here: music_generation (Meta implements music via asset_feed_spec.audios — use disable_music) and standard_enhancements / standard_enhancements_catalog (Marketing API v22+ fails writes carrying them, though a GET still returns them). Features Meta marks AI-generated (image_animation, image_background_gen, image_templates, image_uncrop, video_uncrop) additionally require creating the ad with status=PAUSED and previewing before activation. Ineligible OPT_IN features are silently removed by Meta rather than erroring, so read the creative back to confirm what actually applied. Source: user/agent decision.",
|
|
2922
|
+
"example": {
|
|
2923
|
+
"image_enhancement": "OPT_OUT",
|
|
2924
|
+
"video_auto_crop": "OPT_OUT"
|
|
2925
|
+
},
|
|
2926
|
+
"platform": [
|
|
2927
|
+
"meta"
|
|
2928
|
+
]
|
|
2929
|
+
},
|
|
2930
|
+
{
|
|
2931
|
+
"name": "disable_music",
|
|
2932
|
+
"type": "boolean",
|
|
2933
|
+
"required": false,
|
|
2934
|
+
"description": "Meta only: when true, suppresses Meta's automatically added background music by writing an empty asset_feed_spec.audios. Music is the one enhancement creative_features cannot control — Meta implements it through asset_feed_spec, so passing music_generation to creative_features is rejected and routed here. Only valid on the asset_feed_spec path: a single-asset creative (image_hash / image_url / video_id / child_attachments / object_story_id) cannot carry audios at all, and the call is rejected with that reason rather than silently having no effect. When no asset_feed_spec is supplied, an audios-only spec is created alongside the page-identity object_story_spec, matching Meta's own documented music sample. Optional. Source: user/agent decision boolean.",
|
|
2935
|
+
"example": true,
|
|
2936
|
+
"platform": [
|
|
2937
|
+
"meta"
|
|
2938
|
+
]
|
|
2692
2939
|
}
|
|
2693
2940
|
],
|
|
2694
2941
|
"output_shape": "{\"id\": \"creative_id\"}"
|
|
@@ -3011,9 +3258,10 @@
|
|
|
3011
3258
|
"name": "ads",
|
|
3012
3259
|
"type": "list",
|
|
3013
3260
|
"required": false,
|
|
3014
|
-
"description": "Authored Ads for a manual group. Each object requires headline, copy, cta, and landing_page; create forces every Ad to paused. Omit for generative groups.",
|
|
3261
|
+
"description": "Authored Ads for a manual group. Each object requires name, headline, copy, cta, and landing_page; create forces every Ad to paused. Omit for generative groups.",
|
|
3015
3262
|
"example": [
|
|
3016
3263
|
{
|
|
3264
|
+
"name": "Research_workflow_01",
|
|
3017
3265
|
"headline": "Approved headline",
|
|
3018
3266
|
"copy": "Approved body copy.",
|
|
3019
3267
|
"cta": "Learn more",
|
|
@@ -4499,6 +4747,7 @@
|
|
|
4499
4747
|
"brand_name": "Example",
|
|
4500
4748
|
"ads": [
|
|
4501
4749
|
{
|
|
4750
|
+
"name": "Research_workflow_01",
|
|
4502
4751
|
"headline": "Approved headline",
|
|
4503
4752
|
"copy": "Approved body copy.",
|
|
4504
4753
|
"cta": "Learn more",
|
|
@@ -5683,6 +5932,18 @@
|
|
|
5683
5932
|
"description": "Google only: when true, opts the PMax campaign OUT of final URL expansion. Final URL expansion is ON by default for PMax; this maps to the v24 asset_automation_settings FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION = OPTED_OUT (the removed Campaign.url_expansion_opt_out field). Optional. Source: user/agent decision boolean.",
|
|
5684
5933
|
"example": true
|
|
5685
5934
|
},
|
|
5935
|
+
{
|
|
5936
|
+
"name": "asset_automation",
|
|
5937
|
+
"type": "object",
|
|
5938
|
+
"required": false,
|
|
5939
|
+
"description": "Google only: opt in/out of Google's automatically generated ad assets at create time. Object mapping automation type -> OPTED_IN | OPTED_OUT, e.g. {'text_asset_automation': 'OPTED_OUT'}. Campaign-level types: text_asset_automation, final_url_expansion, generate_enhanced_youtube_videos, generate_image_enhancement, generate_image_extraction — all five are ON by default for Performance Max, so omitting this parameter leaves Google free to generate assets. Ad-level Demand Gen types are rejected here. Supersedes url_expansion_opt_out, which remains accepted for backward compatibility and covers only final_url_expansion. Trap: with final_url_expansion left OPTED_IN, Google still generates text for expanded URLs and that generation cannot be opted out, so OPTED_OUT on text_asset_automation alone does not stop all text generation. Source: user/agent decision.",
|
|
5940
|
+
"example": {
|
|
5941
|
+
"text_asset_automation": "OPTED_OUT"
|
|
5942
|
+
},
|
|
5943
|
+
"platform": [
|
|
5944
|
+
"google"
|
|
5945
|
+
]
|
|
5946
|
+
},
|
|
5686
5947
|
{
|
|
5687
5948
|
"name": "contains_eu_political_advertising",
|
|
5688
5949
|
"type": "string",
|
|
@@ -6794,6 +7055,114 @@
|
|
|
6794
7055
|
],
|
|
6795
7056
|
"output_shape": "{\"success\":true,\"raw\":{}}\nTikTok output: read top-level resource_id for a normalized resource id when present; raw preserves the provider-native TikTok response. When the preceding shape describes another provider, ignore its Meta/Google-only fields."
|
|
6796
7057
|
},
|
|
7058
|
+
{
|
|
7059
|
+
"id": "action:ads/enable_ad_automation_audits",
|
|
7060
|
+
"namespace": "ads",
|
|
7061
|
+
"action": "enable_ad_automation_audits",
|
|
7062
|
+
"description": "HITL provision or recover the current brand's 48-hour and weekly full-current-state Google, Meta, TikTok, and ChatGPT Ads automation audits.",
|
|
7063
|
+
"mode": "risk",
|
|
7064
|
+
"platforms": [
|
|
7065
|
+
"google",
|
|
7066
|
+
"meta",
|
|
7067
|
+
"tiktok",
|
|
7068
|
+
"chatgpt_ads"
|
|
7069
|
+
],
|
|
7070
|
+
"requires_review": true,
|
|
7071
|
+
"freshness_kind": "realtime",
|
|
7072
|
+
"see_also": [
|
|
7073
|
+
"action:ads/audit_ad_automation_inventory"
|
|
7074
|
+
],
|
|
7075
|
+
"long_description": "Primary use:\nProvision or recover the canonical 48-hour and weekly full-current-state ads automation audits across the current brand's Google, Meta, TikTok, and ChatGPT Ads accounts.\n\nUse when:\n- audit_ad_automation_inventory reports audit_schedule_required.\n- A current authorized user needs to take ownership after the former owner lost organization membership.\n\nDo not use when:\n- Running a one-time audit; call audit_ad_automation_inventory instead.\n- The user has not approved recurring task creation. This action requires HITL review.\n\nWorkflow:\n1. Submit the action through action:_batch/submit.\n2. Review the server-bound brand, owner, and both cadence definitions.\n3. Approve to atomically create, reuse, or recover the two Automations.\n4. Each run rediscovers current accounts and Meta Pages, then internally pages audit_ad_automation_inventory for every account.\n\nOutput semantics:\n- automations contains exactly the canonical 48-hour interval and weekly cron tasks, including stable client_request_id and lifecycle status.\n- Active semantic matches are returned idempotently. Paused/error tasks are reactivated and same-owner soft-deleted tasks are restored; semantic conflicts fail closed.\n\nSide effects:\n- Creates or reactivates two user-owned Automation rows for the brand.\n- Does not mutate ad provider settings or start ad spend.",
|
|
7076
|
+
"input_params": [
|
|
7077
|
+
{
|
|
7078
|
+
"name": "platform",
|
|
7079
|
+
"type": "string",
|
|
7080
|
+
"required": true,
|
|
7081
|
+
"description": "Connected ads platform that anchors capability routing. Provisioning always creates both brand-wide schedules and audits every currently connected Google, Meta, TikTok, and ChatGPT Ads account.",
|
|
7082
|
+
"example": "google",
|
|
7083
|
+
"enum": [
|
|
7084
|
+
"google",
|
|
7085
|
+
"meta",
|
|
7086
|
+
"tiktok",
|
|
7087
|
+
"chatgpt_ads"
|
|
7088
|
+
],
|
|
7089
|
+
"source": "constant"
|
|
7090
|
+
}
|
|
7091
|
+
],
|
|
7092
|
+
"output_shape": "{\"success\":true,\"created_via\":\"ads_automation_audit\",\"brand_id\":\"...\",\"owner_user_id\":\"...\",\"automations\":[{\"automation_id\":\"...\",\"client_request_id\":\"...\",\"status\":\"active\",\"schedule_type\":\"interval|cron\",\"schedule_config\":{...}}]}\nTikTok output: uses the same brand-scoped provisioning envelope."
|
|
7093
|
+
},
|
|
7094
|
+
{
|
|
7095
|
+
"id": "action:ads/establish_automation_baseline",
|
|
7096
|
+
"namespace": "ads",
|
|
7097
|
+
"action": "establish_automation_baseline",
|
|
7098
|
+
"description": "HITL Google, Meta, TikTok, or ChatGPT Ads confirmation of a fresh provider state as a human baseline.",
|
|
7099
|
+
"mode": "risk",
|
|
7100
|
+
"platforms": [
|
|
7101
|
+
"google",
|
|
7102
|
+
"meta",
|
|
7103
|
+
"tiktok",
|
|
7104
|
+
"chatgpt_ads"
|
|
7105
|
+
],
|
|
7106
|
+
"requires_review": true,
|
|
7107
|
+
"freshness_kind": "realtime",
|
|
7108
|
+
"see_also": [
|
|
7109
|
+
"action:ads/preview_automation_baseline"
|
|
7110
|
+
],
|
|
7111
|
+
"long_description": "Primary use:\nConfirm a freshly previewed Google, Meta, TikTok, or ChatGPT Ads provider state as a human baseline for a pre-existing entity.\n\nUse when:\n- preview_automation_baseline returned the digest the user is approving.\n\nDo not use when:\n- The preview is stale or belongs to another identity; preview again.\n- Replacing an authoritative Soku-write baseline. Soku-write authority always wins the atomic conflict.\n\nWorkflow:\n1. Submit the identity and preview_digest through action:_batch/submit.\n2. Review the observed automation state and approve it.\n3. Execution revalidates ownership and fresh-reads provider state.\n4. If the identity-bound digest still matches, atomically store the human baseline; otherwise the action rejects and requires a new preview.\n\nOutput semantics:\n- baseline_status is established for a new write or idempotent for the same already-confirmed observation.\n- baseline_source is human_baseline, which is explicitly less authoritative than an original Soku write.\n\nSide effects:\n- Inserts or updates the local human automation baseline after HITL approval.\n- Does not mutate provider automation settings.",
|
|
7112
|
+
"input_params": [
|
|
7113
|
+
{
|
|
7114
|
+
"name": "platform",
|
|
7115
|
+
"type": "string",
|
|
7116
|
+
"required": true,
|
|
7117
|
+
"description": "google, meta, tiktok, or chatgpt_ads.",
|
|
7118
|
+
"example": "chatgpt_ads",
|
|
7119
|
+
"enum": [
|
|
7120
|
+
"google",
|
|
7121
|
+
"meta",
|
|
7122
|
+
"tiktok",
|
|
7123
|
+
"chatgpt_ads"
|
|
7124
|
+
],
|
|
7125
|
+
"source": "constant"
|
|
7126
|
+
},
|
|
7127
|
+
{
|
|
7128
|
+
"name": "account_id",
|
|
7129
|
+
"type": "string",
|
|
7130
|
+
"required": true,
|
|
7131
|
+
"description": "Brand-scoped ad account id from ads.list_ad_accounts.",
|
|
7132
|
+
"example": "adv_123",
|
|
7133
|
+
"source": "upstream:action:ads/list_ad_accounts"
|
|
7134
|
+
},
|
|
7135
|
+
{
|
|
7136
|
+
"name": "entity_type",
|
|
7137
|
+
"type": "string",
|
|
7138
|
+
"required": true,
|
|
7139
|
+
"description": "Audited entity type: meta=creative; google/tiktok=campaign; chatgpt_ads=campaign or ad_group.",
|
|
7140
|
+
"example": "campaign",
|
|
7141
|
+
"enum": [
|
|
7142
|
+
"campaign",
|
|
7143
|
+
"creative",
|
|
7144
|
+
"ad_group"
|
|
7145
|
+
],
|
|
7146
|
+
"source": "constant"
|
|
7147
|
+
},
|
|
7148
|
+
{
|
|
7149
|
+
"name": "entity_id",
|
|
7150
|
+
"type": "string",
|
|
7151
|
+
"required": true,
|
|
7152
|
+
"description": "Same provider entity id used for the preview.",
|
|
7153
|
+
"example": "campaign_123"
|
|
7154
|
+
},
|
|
7155
|
+
{
|
|
7156
|
+
"name": "preview_digest",
|
|
7157
|
+
"type": "string",
|
|
7158
|
+
"required": true,
|
|
7159
|
+
"description": "Identity-bound digest returned by preview_automation_baseline.",
|
|
7160
|
+
"example": "6f1a...",
|
|
7161
|
+
"source": "upstream:action:ads/preview_automation_baseline"
|
|
7162
|
+
}
|
|
7163
|
+
],
|
|
7164
|
+
"output_shape": "{\"success\":true,\"baseline_source\":\"human_baseline\",\"baseline_status\":\"established|idempotent\",\"observation\":{...},\"observed_at\":\"...\"}\nTikTok output: the same human-baseline result envelope."
|
|
7165
|
+
},
|
|
6797
7166
|
{
|
|
6798
7167
|
"id": "action:ads/estimate_audience_size",
|
|
6799
7168
|
"namespace": "ads",
|
|
@@ -11626,7 +11995,7 @@
|
|
|
11626
11995
|
"action:ads/get_ad_group",
|
|
11627
11996
|
"action:_batch/submit"
|
|
11628
11997
|
],
|
|
11629
|
-
"long_description": "Primary use:\nPerform an explicit, idempotent HITL migration from caller-supplied legacy Ad Unit records into paused manual Ad Groups and Ads without changing legacy resources.\n\nUse when:\n- The user approved migration for a known Campaign and supplied complete legacy records.\n\nDo not use when:\n- The caller expects automatic legacy discovery, deletion, archival, or activation.\n- Any prior result is ambiguous and has not been reconciled.\n\nWorkflow:\n1. Supply stable ad_unit_id identities and approved content for every record.\n2. Submit one migration through HITL review.\n3. Inspect records[] and require materialization_verified=true for full success.\n4. Reconcile existing/created/ambiguous/failed records before retry.\n\nOutput semantics:\n- Success returns ordered records[], ad_group_ids, ad_ids, materialization_verified=true, and legacy_resources_modified=false.\n- A blocked, partial_failure, or unknown outcome returns per-record status and reconcile_required=true; known ids are retained.\n\nSide effects:\n- May create paused Ad Groups and authored Ads.\n- Never modifies, archives, or deletes the supplied legacy resources.",
|
|
11998
|
+
"long_description": "Primary use:\nPerform an explicit, idempotent HITL migration from caller-supplied legacy Ad Unit records into paused manual Ad Groups and Ads without changing legacy resources.\n\nUse when:\n- The user approved migration for a known Campaign and supplied complete legacy records.\n\nDo not use when:\n- The caller expects automatic legacy discovery, deletion, archival, or activation.\n- The caller wants to repair existing Ad names; the separate guarded runner is plan-only by default, pauses and reads back active targets, orders by canonical ad_id, and never activates or submits review.\n- Any prior result is ambiguous and has not been reconciled.\n\nWorkflow:\n1. Supply stable ad_unit_id identities and approved content for every record.\n2. Submit one migration through HITL review.\n3. Inspect records[] and require materialization_verified=true for full success.\n4. Reconcile existing/created/ambiguous/failed records before retry.\n\nOutput semantics:\n- Success returns ordered records[], ad_group_ids, ad_ids, materialization_verified=true, and legacy_resources_modified=false.\n- A blocked, partial_failure, or unknown outcome returns per-record status and reconcile_required=true; known ids are retained.\n\nSide effects:\n- May create paused Ad Groups and authored Ads.\n- Never modifies, archives, or deletes the supplied legacy resources.",
|
|
11630
11999
|
"input_params": [
|
|
11631
12000
|
{
|
|
11632
12001
|
"name": "platform",
|
|
@@ -11666,10 +12035,11 @@
|
|
|
11666
12035
|
"name": "legacy_ad_units",
|
|
11667
12036
|
"type": "list",
|
|
11668
12037
|
"required": true,
|
|
11669
|
-
"description": "Non-empty explicit records. Every record requires stable ad_unit_id, headline, static_ad_text, static_cta, landing_page, and brand_name; optional fields include description, ad_name, image_url, and utm_params.",
|
|
12038
|
+
"description": "Non-empty explicit records. Every record requires stable ad_unit_id, headline, static_ad_text, static_cta, landing_page, and brand_name; optional fields include description, ad_name, image_url, and utm_params. When ad_name is omitted, migration derives 'Legacy migration <ad_unit_id> Ad'; explicit null or blank is rejected.",
|
|
11670
12039
|
"example": [
|
|
11671
12040
|
{
|
|
11672
12041
|
"ad_unit_id": "legacy_123",
|
|
12042
|
+
"ad_name": "Legacy migration legacy_123 Ad",
|
|
11673
12043
|
"headline": "Approved headline",
|
|
11674
12044
|
"static_ad_text": "Approved body copy.",
|
|
11675
12045
|
"static_cta": "Learn more",
|
|
@@ -11687,6 +12057,70 @@
|
|
|
11687
12057
|
],
|
|
11688
12058
|
"output_shape": "{\"success\": true|false, \"campaign_id\": \"campaign_123\", \"records\": [{\"index\": 0, \"ad_unit_id\": \"legacy_123\", \"status\": \"existing|created|ambiguous|failed\", \"ad_group_id\": \"ag_123\", \"ad_ids\": [\"ad_123\"]}], \"materialization_verified\": true, \"legacy_resources_modified\": false}"
|
|
11689
12059
|
},
|
|
12060
|
+
{
|
|
12061
|
+
"id": "action:ads/preview_automation_baseline",
|
|
12062
|
+
"namespace": "ads",
|
|
12063
|
+
"action": "preview_automation_baseline",
|
|
12064
|
+
"description": "Read-only Google, Meta, TikTok, or ChatGPT Ads automation observation and identity-bound approval digest.",
|
|
12065
|
+
"mode": "read",
|
|
12066
|
+
"platforms": [
|
|
12067
|
+
"google",
|
|
12068
|
+
"meta",
|
|
12069
|
+
"tiktok",
|
|
12070
|
+
"chatgpt_ads"
|
|
12071
|
+
],
|
|
12072
|
+
"requires_review": false,
|
|
12073
|
+
"freshness_kind": "realtime",
|
|
12074
|
+
"see_also": [
|
|
12075
|
+
"action:ads/establish_automation_baseline"
|
|
12076
|
+
],
|
|
12077
|
+
"long_description": "Primary use:\nRead a provider entity's current automation state and prepare an identity-bound digest for human baseline approval.\n\nUse when:\n- A pre-existing Google, Meta, TikTok, or ChatGPT Ads entity has no authoritative Soku-written baseline.\n\nDo not use when:\n- The entity already has an authoritative Soku-write baseline that should be preserved.\n- The caller wants to provide expected state, source, or provenance; those fields are server-derived.\n\nWorkflow:\n1. Resolve the brand-scoped account and provider entity.\n2. Fresh-read and canonicalize its automation state.\n3. Present observation and preview_digest to the user.\n4. Submit establish_automation_baseline with the unchanged identity and digest for HITL approval.\n\nOutput semantics:\n- observation is fresh provider state; observed_at records read time.\n- preview_digest binds organization, account, platform, entity identity, observation, and schema version and cannot be replayed across identities.\n\nSide effects:\n- None. This action reads provider state and does not persist a baseline.",
|
|
12078
|
+
"input_params": [
|
|
12079
|
+
{
|
|
12080
|
+
"name": "platform",
|
|
12081
|
+
"type": "string",
|
|
12082
|
+
"required": true,
|
|
12083
|
+
"description": "google, meta, tiktok, or chatgpt_ads.",
|
|
12084
|
+
"example": "chatgpt_ads",
|
|
12085
|
+
"enum": [
|
|
12086
|
+
"google",
|
|
12087
|
+
"meta",
|
|
12088
|
+
"tiktok",
|
|
12089
|
+
"chatgpt_ads"
|
|
12090
|
+
],
|
|
12091
|
+
"source": "constant"
|
|
12092
|
+
},
|
|
12093
|
+
{
|
|
12094
|
+
"name": "account_id",
|
|
12095
|
+
"type": "string",
|
|
12096
|
+
"required": true,
|
|
12097
|
+
"description": "Brand-scoped ad account id from ads.list_ad_accounts.",
|
|
12098
|
+
"example": "adv_123",
|
|
12099
|
+
"source": "upstream:action:ads/list_ad_accounts"
|
|
12100
|
+
},
|
|
12101
|
+
{
|
|
12102
|
+
"name": "entity_type",
|
|
12103
|
+
"type": "string",
|
|
12104
|
+
"required": true,
|
|
12105
|
+
"description": "Audited entity type: meta=creative; google/tiktok=campaign; chatgpt_ads=campaign or ad_group.",
|
|
12106
|
+
"example": "campaign",
|
|
12107
|
+
"enum": [
|
|
12108
|
+
"campaign",
|
|
12109
|
+
"creative",
|
|
12110
|
+
"ad_group"
|
|
12111
|
+
],
|
|
12112
|
+
"source": "constant"
|
|
12113
|
+
},
|
|
12114
|
+
{
|
|
12115
|
+
"name": "entity_id",
|
|
12116
|
+
"type": "string",
|
|
12117
|
+
"required": true,
|
|
12118
|
+
"description": "Provider entity id in the selected account and entity type.",
|
|
12119
|
+
"example": "campaign_123"
|
|
12120
|
+
}
|
|
12121
|
+
],
|
|
12122
|
+
"output_shape": "{\"success\":true,\"platform\":\"...\",\"account_id\":\"...\",\"entity_type\":\"...\",\"entity_id\":\"...\",\"observation\":{...},\"observed_at\":\"...\",\"schema_version\":1,\"preview_digest\":\"...\",\"read_only\":true}\nTikTok output: the same canonical baseline preview envelope."
|
|
12123
|
+
},
|
|
11690
12124
|
{
|
|
11691
12125
|
"id": "action:ads/query_multi_dimension",
|
|
11692
12126
|
"namespace": "ads",
|
|
@@ -11858,6 +12292,78 @@
|
|
|
11858
12292
|
],
|
|
11859
12293
|
"output_shape": "{\"account\": {\"platform\": \"google\", \"account_id\": \"123\", \"data_freshness\": \"ISO\"}, \"dimension\": \"campaign\", \"data_basis\": {\"view\": \"...\", \"parquet_table\": \"...\", \"selected_scope\": \"campaign\", \"cg_fan_out_available\": true}, \"scope_caveat\": \"...\", \"row_count\": 128, \"truncated\": false, \"warning\": null, \"columns\": {\"campaign_id\": [...], \"spend_micros\": [...], \"ctr\": [...], \"cg.qualified-new-user.all_conv\": [...]}, \"summary\": null, \"readiness\": null | {\"partial\": true, \"readiness\": {...}, \"fallback\": {...}}}"
|
|
11860
12294
|
},
|
|
12295
|
+
{
|
|
12296
|
+
"id": "action:ads/register_automation_copy",
|
|
12297
|
+
"namespace": "ads",
|
|
12298
|
+
"action": "register_automation_copy",
|
|
12299
|
+
"description": "HITL register a Google, Meta, TikTok, or ChatGPT Ads copy from one authoritative automation intent.",
|
|
12300
|
+
"mode": "risk",
|
|
12301
|
+
"platforms": [
|
|
12302
|
+
"google",
|
|
12303
|
+
"meta",
|
|
12304
|
+
"tiktok",
|
|
12305
|
+
"chatgpt_ads"
|
|
12306
|
+
],
|
|
12307
|
+
"requires_review": true,
|
|
12308
|
+
"freshness_kind": "realtime",
|
|
12309
|
+
"see_also": [
|
|
12310
|
+
"action:ads/preview_automation_baseline",
|
|
12311
|
+
"action:ads/audit_creative_automation"
|
|
12312
|
+
],
|
|
12313
|
+
"long_description": "Primary use:\nRegister the verified lineage of an externally copied Google, Meta, TikTok, or ChatGPT Ads entity and inherit the source entity's authoritative Soku-written automation intent.\n\nUse when:\n- A provider UI or external tool created a new entity ID from a source with an authoritative Soku-write baseline.\n\nDo not use when:\n- The source has only a human baseline or no baseline.\n- Source and copied identities are in different accounts, platforms, or entity types.\n- The caller is guessing lineage, expected state, or source authority.\n\nWorkflow:\n1. Submit source and new identities through action:_batch/submit.\n2. Review preparation resolves source authority and injects a digest bound to both identities.\n3. After approval, execution revalidates account scope and both provider identities, then reloads source authority.\n4. Inherit the intent atomically and fresh-read the copy for an immediate canonical diff.\n\nOutput semantics:\n- registration_status confirms inheritance; expected is copied from the authoritative source and current comes from provider readback.\n- findings immediately report OK or DRIFTED for the copied entity.\n\nSide effects:\n- Inserts the copied entity's local authoritative intent baseline after HITL approval.\n- Does not mutate either provider entity.",
|
|
12314
|
+
"input_params": [
|
|
12315
|
+
{
|
|
12316
|
+
"name": "platform",
|
|
12317
|
+
"type": "string",
|
|
12318
|
+
"required": true,
|
|
12319
|
+
"description": "google, meta, tiktok, or chatgpt_ads.",
|
|
12320
|
+
"example": "chatgpt_ads",
|
|
12321
|
+
"enum": [
|
|
12322
|
+
"google",
|
|
12323
|
+
"meta",
|
|
12324
|
+
"tiktok",
|
|
12325
|
+
"chatgpt_ads"
|
|
12326
|
+
],
|
|
12327
|
+
"source": "constant"
|
|
12328
|
+
},
|
|
12329
|
+
{
|
|
12330
|
+
"name": "account_id",
|
|
12331
|
+
"type": "string",
|
|
12332
|
+
"required": true,
|
|
12333
|
+
"description": "Brand-scoped ad account id from ads.list_ad_accounts.",
|
|
12334
|
+
"example": "adv_123",
|
|
12335
|
+
"source": "upstream:action:ads/list_ad_accounts"
|
|
12336
|
+
},
|
|
12337
|
+
{
|
|
12338
|
+
"name": "entity_type",
|
|
12339
|
+
"type": "string",
|
|
12340
|
+
"required": true,
|
|
12341
|
+
"description": "Audited entity type: meta=creative; google/tiktok=campaign; chatgpt_ads=campaign or ad_group.",
|
|
12342
|
+
"example": "campaign",
|
|
12343
|
+
"enum": [
|
|
12344
|
+
"campaign",
|
|
12345
|
+
"creative",
|
|
12346
|
+
"ad_group"
|
|
12347
|
+
],
|
|
12348
|
+
"source": "constant"
|
|
12349
|
+
},
|
|
12350
|
+
{
|
|
12351
|
+
"name": "source_entity_id",
|
|
12352
|
+
"type": "string",
|
|
12353
|
+
"required": true,
|
|
12354
|
+
"description": "Provider id with an authoritative Soku-written baseline.",
|
|
12355
|
+
"example": "campaign_source"
|
|
12356
|
+
},
|
|
12357
|
+
{
|
|
12358
|
+
"name": "new_entity_id",
|
|
12359
|
+
"type": "string",
|
|
12360
|
+
"required": true,
|
|
12361
|
+
"description": "Copied provider entity id in the same account and entity type.",
|
|
12362
|
+
"example": "campaign_copy"
|
|
12363
|
+
}
|
|
12364
|
+
],
|
|
12365
|
+
"output_shape": "{\"success\":true,\"registration_status\":\"registered\",\"source_entity_id\":\"...\",\"new_entity_id\":\"...\",\"expected\":{...},\"current\":{...},\"findings\":[...],\"summary\":{\"ok\":N,\"drifted\":N,\"no_baseline\":0}}\nTikTok output: the same canonical immediate-diff envelope."
|
|
12366
|
+
},
|
|
11861
12367
|
{
|
|
11862
12368
|
"id": "action:ads/remove_account_negative_keywords",
|
|
11863
12369
|
"namespace": "ads",
|
|
@@ -14311,7 +14817,7 @@
|
|
|
14311
14817
|
"name": "name",
|
|
14312
14818
|
"type": "string",
|
|
14313
14819
|
"required": false,
|
|
14314
|
-
"description": "Meta only: new name for the ad (renames the Ad node). Google only: not applicable. Source: user-provided ad name. ChatGPT Ads: Optional authored Ad name.",
|
|
14820
|
+
"description": "Meta only: new name for the ad (renames the Ad node). Google only: not applicable. Source: user-provided ad name. ChatGPT Ads: Optional replacement authored Ad name.",
|
|
14315
14821
|
"example": "Summer sale - v2",
|
|
14316
14822
|
"platform": [
|
|
14317
14823
|
"google",
|
|
@@ -15298,7 +15804,7 @@
|
|
|
15298
15804
|
"action:_batch/submit",
|
|
15299
15805
|
"action:ads/list_operation_records"
|
|
15300
15806
|
],
|
|
15301
|
-
"long_description": "Supported platforms: google, meta, tiktok, chatgpt_ads. For TikTok, use platform=tiktok and the parameters tagged for TikTok. Provider-specific guidance below is conditional and does not narrow the supported-platform list.\n\nTikTok behavior:\nThis action calls its provider-native TikTok Marketing API handler and returns the native TikTok response; do not infer Meta Graph fields.\n\nOther-platform guidance (not applicable when platform=tiktok):\nPrimary use:\nMutate an existing campaign's name, status, budget, bidding strategy, or platform-specific settings. This is the canonical way to activate, pause, rename, rebudget, or change campaign-level bidding.\n\nUse when:\n- The user wants to activate a paused campaign (status -> ENABLED on Google or ACTIVE on Meta).\n- The user wants to pause an active campaign or change its daily budget.\n- The user wants to change a Google campaign bidding strategy (MAXIMIZE_CLICKS, TARGET_CPA, TARGET_ROAS, etc.).\n- The user wants to retarget the Meta objective, bid_strategy, or spend_cap.\n\nDo not use when:\n- The campaign does not exist yet. Use action:ads/create_campaign.\n- The change touches ad groups, ad sets, ads, or keywords. Use the matching action:ads/update_ad_group / update_adset / update_ad / update_keyword.\n- The user wants targeting changes. Use action:ads/set_geo_targeting, set_language_targeting, set_network_settings, or set_bid_modifier.\n\nWorkflow:\n1. Call action:ads/list_campaigns to fetch the current state and capture old values for rollback.\n2. Submit via action:_batch/submit for HITL review.\n3. Verify via action:ads/list_campaigns or action:ads/gaql_search with dimensions=['campaign','bidding_strategy'].\n\nOutput semantics:\n- Top-level envelope: see Cross-cutting envelope in capabilities-api.md.\n- Google raw.message lists the fields actually updated (name, status, start_date, end_date, budget_amount_micros, bidding_strategy, target_cpa_micros, target_roas, max_cpc_bid_micros). Returns success=false with 'No fields to update were provided.' if no mutable field is supplied.\n- Meta raw is the Graph API body: {success: true}.\n\nSide effects:\n- Modifies platform-side campaign settings; reversible only if the caller captured the prior value before the update.\n- Setting status to ENABLED (Google) or ACTIVE (Meta) resumes spend immediately if the campaign has non-zero budget.\n- Google performs at most two MutateOperations in one mutate: a Campaign update plus an optional CampaignBudget update for amount_micros. Google bidding changes update the Campaign bidding oneof; TARGET_CPA requires target_cpa_micros and TARGET_ROAS requires target_roas. MAXIMIZE_CONVERSIONS accepts an optional target_cpa_micros and MAXIMIZE_CONVERSION_VALUE an optional target_roas (Google's standard tCPA/tROAS forms); a target value that does not apply to the chosen strategy is rejected instead of silently dropped. Switching to MAXIMIZE_CONVERSIONS/MAXIMIZE_CONVERSION_VALUE without a target clears any existing target on the campaign (warning emitted).\n- Reversibility: re-call with prior values to roll back.\n\nChatGPT Ads activation:\n- Keep creation paused. status=active is a separate risk write and requires its own explicit user approval.\n- Read action:ads/get_account_info first. Its activation_preflight is conservative and non-authoritative
|
|
15807
|
+
"long_description": "Supported platforms: google, meta, tiktok, chatgpt_ads. For TikTok, use platform=tiktok and the parameters tagged for TikTok. Provider-specific guidance below is conditional and does not narrow the supported-platform list.\n\nTikTok behavior:\nThis action calls its provider-native TikTok Marketing API handler and returns the native TikTok response; do not infer Meta Graph fields.\n\nOther-platform guidance (not applicable when platform=tiktok):\nPrimary use:\nMutate an existing campaign's name, status, budget, bidding strategy, or platform-specific settings. This is the canonical way to activate, pause, rename, rebudget, or change campaign-level bidding.\n\nUse when:\n- The user wants to activate a paused campaign (status -> ENABLED on Google or ACTIVE on Meta).\n- The user wants to pause an active campaign or change its daily budget.\n- The user wants to change a Google campaign bidding strategy (MAXIMIZE_CLICKS, TARGET_CPA, TARGET_ROAS, etc.).\n- The user wants to retarget the Meta objective, bid_strategy, or spend_cap.\n\nDo not use when:\n- The campaign does not exist yet. Use action:ads/create_campaign.\n- The change touches ad groups, ad sets, ads, or keywords. Use the matching action:ads/update_ad_group / update_adset / update_ad / update_keyword.\n- The user wants targeting changes. Use action:ads/set_geo_targeting, set_language_targeting, set_network_settings, or set_bid_modifier.\n\nWorkflow:\n1. Call action:ads/list_campaigns to fetch the current state and capture old values for rollback.\n2. Submit via action:_batch/submit for HITL review.\n3. Verify via action:ads/list_campaigns or action:ads/gaql_search with dimensions=['campaign','bidding_strategy'].\n\nOutput semantics:\n- Top-level envelope: see Cross-cutting envelope in capabilities-api.md.\n- Google raw.message lists the fields actually updated (name, status, start_date, end_date, budget_amount_micros, bidding_strategy, target_cpa_micros, target_roas, max_cpc_bid_micros, asset_automation). Returns success=false with 'No fields to update were provided.' if no mutable field is supplied.\n- When asset_automation is supplied, raw.asset_automation_settings is the COMPLETE merged list that was written (including entries you did not name), so it can be snapshotted as the approved intent.\n- Meta raw is the Graph API body: {success: true}.\n\nSide effects:\n- Modifies platform-side campaign settings; reversible only if the caller captured the prior value before the update.\n- Setting status to ENABLED (Google) or ACTIVE (Meta) resumes spend immediately if the campaign has non-zero budget.\n- Google performs at most two MutateOperations in one mutate: a Campaign update plus an optional CampaignBudget update for amount_micros. Google bidding changes update the Campaign bidding oneof; TARGET_CPA requires target_cpa_micros and TARGET_ROAS requires target_roas. MAXIMIZE_CONVERSIONS accepts an optional target_cpa_micros and MAXIMIZE_CONVERSION_VALUE an optional target_roas (Google's standard tCPA/tROAS forms); a target value that does not apply to the chosen strategy is rejected instead of silently dropped. Switching to MAXIMIZE_CONVERSIONS/MAXIMIZE_CONVERSION_VALUE without a target clears any existing target on the campaign (warning emitted).\n- Google asset_automation adds a third read (the campaign's current asset_automation_settings) before the mutate, and writes the merged list back under the bare 'asset_automation_settings' mask path. Two invariants are asserted before the mutate is sent: no automation type you did not name changes status, and no type appears twice; either failure returns success=false without touching the platform.\n- Reversibility: re-call with prior values to roll back.\n\nChatGPT Ads activation:\n- Keep creation paused. status=active is a separate risk write and requires its own explicit user approval.\n- Creation still sends the server-owned network_mode=openai under the private account-capability contract. A public generic advertiser-dashboard contract that describes server-managed allocation does not prove or replace that private contract.\n- Read action:ads/get_account_info first. Its activation_preflight is conservative and non-authoritative. Immediately before PATCH, Soku reads the exact Campaign and requires the same id, an explicitly non-active state, and literal network_mode=openai. Missing, conflicting, identity-mismatched, or failed readback stops with no activation PATCH.\n- An activation-only HTTP 402 returns CHATGPT_ADS_BILLING_REQUIRED with a safe account-side funding handoff. Retry the same approved activation only after the account-side binding is complete.",
|
|
15302
15808
|
"input_params": [
|
|
15303
15809
|
{
|
|
15304
15810
|
"name": "platform",
|
|
@@ -15338,7 +15844,7 @@
|
|
|
15338
15844
|
"name": "status",
|
|
15339
15845
|
"type": "string",
|
|
15340
15846
|
"required": false,
|
|
15341
|
-
"description": "Provider-specific lifecycle state (no global enum because the shared action has different provider vocabularies). TikTok: ENABLED, PAUSED, or REMOVED, mapped to ENABLE, DISABLE, or DELETE. ChatGPT Ads: DRAFT, ACTIVE, or PAUSED. Google/Meta follow their provider contracts. REMOVED is allowed only for update where supported.",
|
|
15847
|
+
"description": "Provider-specific lifecycle state (no global enum because the shared action has different provider vocabularies). TikTok: ENABLED, PAUSED, or REMOVED, mapped to ENABLE, DISABLE, or DELETE. ChatGPT Ads: DRAFT, ACTIVE, or PAUSED. Google/Meta follow their provider contracts. For ChatGPT Ads ACTIVE, exact Campaign GET must prove the same id, non-active state, and literal network_mode=openai; omitted or conflicting evidence and read failures send no activation PATCH. REMOVED is allowed only for update where supported.",
|
|
15342
15848
|
"example": "PAUSED",
|
|
15343
15849
|
"source": "constant"
|
|
15344
15850
|
},
|
|
@@ -15435,6 +15941,18 @@
|
|
|
15435
15941
|
"google"
|
|
15436
15942
|
]
|
|
15437
15943
|
},
|
|
15944
|
+
{
|
|
15945
|
+
"name": "asset_automation",
|
|
15946
|
+
"type": "object",
|
|
15947
|
+
"required": false,
|
|
15948
|
+
"description": "Google only: opt in/out of Google's automatically generated ad assets. Object mapping automation type -> OPTED_IN | OPTED_OUT, e.g. {'text_asset_automation': 'OPTED_OUT', 'final_url_expansion': 'OPTED_OUT'}. Campaign-level types: text_asset_automation, final_url_expansion, generate_enhanced_youtube_videos, generate_image_enhancement, generate_image_extraction (all five are ON by default for Performance Max; the two text ones are also supported on Search, where they default OFF). Ad-level Demand Gen types are rejected here. Read-modify-write: the campaign's current settings are read and merged first, because the underlying repeated field can only be written as a whole list — types you do not name keep their status. Trap: with final_url_expansion left OPTED_IN, Google still generates text for expanded URLs and that generation cannot be opted out, so OPTED_OUT on text_asset_automation alone does not stop all text generation. Source: user/agent decision.",
|
|
15949
|
+
"example": {
|
|
15950
|
+
"text_asset_automation": "OPTED_OUT"
|
|
15951
|
+
},
|
|
15952
|
+
"platform": [
|
|
15953
|
+
"google"
|
|
15954
|
+
]
|
|
15955
|
+
},
|
|
15438
15956
|
{
|
|
15439
15957
|
"name": "objective",
|
|
15440
15958
|
"type": "string",
|