Bug Report: add_smart_list_rule fails for Marketo system boolean fields | Community
Skip to main content
Level 2
July 1, 2026
Question

Bug Report: add_smart_list_rule fails for Marketo system boolean fields

  • July 1, 2026
  • 1 reply
  • 52 views

What I tested

We were using the MCP to bulk-update smart lists across 59 nested programs in an engagement program. The goal was to add two filters to each smart campaign's smart list: an Email Address filter and a Marketing Suspended filter, then switch the filter logic to ANY.

What worked

Adding string-type filters works great. We successfully added Email Address (not contains[".edu", ".org"]) across all 59 smart lists using add_smart_list_rule followed by update_smart_list_rule. Filter logic updates via update_smart_list_filter_logic also worked perfectly. This was a huge time saver.

The bug

add_smart_list_rule returns error 709 "Smart List Rule Type Unsupported" for any Marketo system boolean field. We tested:

  • Marketing Suspended (id: 85)
  • Email Suspended (id: 123)
  • Unsubscribed (id: 79)
  • Black Listed (id: 87)
  • Do Not Call (id: 82)
  • Email Invalid (id: 77)
  • Email Invalid Cause (id: 78, string type but system-managed)

All return the same 709 error regardless of what we pass for ruleTypeindex, or isTrigger.

Key finding

Custom boolean fields work fine with the same parameters. We tested CF_First_Gen_Flag (id: 843) and CF_Athletic_Recruit_Flag (id: 808) — both added successfully. So the restriction is specific to Marketo's built-in system fields, not boolean data types in general.

Additional note

Since delete_smart_list_rule is disabled in the beta, there's no API cleanup path when an add fails or leaves a stray rule — it requires manual removal in the Marketo UI. Worth considering alongside this bug since the two issues compound each other.

Expected result: Filter added, same as custom boolean fields

Actual result: 709 "Smart List Rule Type Unsupported"

Workaround: System boolean filters must be added manually in the Marketo UI. We ended up with a hybrid approach — MCP for everything it supports, manual UI work for the blocked fields.

1 reply

Level 3
July 12, 2026

Ty for sharing detailed findings ​@AntFig. Marketo throws the 709 "Smart List Rule Type Unsupported" error on built-in boolean fields.

The Technical Root Cause

If you query Marketo's schema using describe_lead, the smoking gun appears in the metadata for these specific fields. For example, system fields like marketingSuspended return:

JSON:

"dataType": "boolean",
"searchable": false
  • Custom Booleans vs. System Booleans: When you create a custom boolean field, Marketo provisions it as "searchable": true at the API layer. The Asset API gateway relies strictly on this flag. Because core system fields are explicitly set to searchable: false to protect database indexing performance, the add_smart_list_rule endpoint outright rejects them.

  • The Downstream Value Bug: This also explains why attempting an add_smart_list_rule with values like ["true"] or [true] fails with compounding syntax errors (709 Db attribute not valid vs 709 Invalid Value Data Type). The API parser cannot resolve input values for a rule structure that it refuses to validate in the first place.

  • The Beta Compounder: Because delete_smart_list_rule is currently disabled in the beta, any failed rule creation or partial modification leaves a "stray" state that forces you back into the UI for cleanup.

Scalable Workarounds (To Bypass the Manual UI Grind)

If you are dealing with large-scale nested programs (like 59-program engagement matrix) and need to automate your smart list updates, you can use these two design patterns to bypass the API limitation.

The Master Smart List Reference Injection:

Instead of trying to force the API to handle system fields directly inside every single smart list, abstract the logic entirely.

  1. Manual Setup (One-Time): Create a single Master Smart List manually in the Marketo UI (e.g., 00_Global_Master_Exclusions). Add all your system boolean filters there (Marketing Suspended = true, Unsubscribed = true, etc.).

  2. API Automation: Use the MCP to programmatically inject a Member of Smart List filter across your 59 smart lists, passing the ID of your master list.

  • Why it works: The Asset API fully supports adding and updating Member of Smart List rules (which are handled as string/ID lookups) without throwing the 709 error.

By adjusting your program architecture to rely on reference lists or searchable custom fields, you can fully leverage the speed of the MCP API without getting blocked by hardcoded database restrictions.

Found this helpful? Mark the thread as solved so other community members can quickly locate the answer.
AntFigAuthor
Level 2
July 13, 2026

Thanks so much for digging into this - I really appreciate the detailed write-up, and I'm glad the trigger/asset patterns are working well for you elsewhere!

Wanted to follow up after testing this against our own instance, because I don't think the searchable flag is actually what's gating this. We pulled describe_lead and checked: our system fields (Marketing Suspended, Unsubscribed, etc.) are searchable: false, as you said - but so are the two custom booleans that worked fine for us in the original test (CF_First_Gen_Flag, CF_Athletic_Recruit_Flag). If searchable were the gate, those should've failed too, and they didn't. My best guess now is that it's actually about how add_smart_list_rule works under the hood — it first creates an empty rule, then a separate call fills in the value. That's fine for a string field (empty string is a valid interim state), but system-managed compliance fields like Marketing Suspended probably don't have a valid "unset" state internally, so the empty-rule create gets rejected outright. Custom booleans default to false, so they sail through. Happy to be wrong here, just wanted to flag what we found in case it saves someone a debugging detour.

On the Master Smart List workaround - clever idea, and "Member of Smart List" is definitely a real, working rule type, so credit where it's due. We ended up not going this route, though: on a big multi-workspace instance with a lot of concurrent campaigns, cross-referenced smart list filters carry real evaluation cost, and an overloaded batch campaign can time out and just skip a slow filter rather than block on it. For most filters, that's a minor annoyance. For a suppression filter like Marketing Suspended, a skipped filter means suppressed leads could slip through silently - which isn't a risk we're willing to take. Wanted to mention it in case anyone else on a busy instance was about to reach for this same pattern.

For now, we're just adding this one filter type by hand in the UI and automating everything else via the MCP - it works fine, just not as fully hands-off as we'd hoped. Thanks again for the thoughtful response!

Level 3
July 14, 2026

Short answer: Your hypothesis is the most logical explanation we have, but it remains a strong working theory rather than an absolute fact, as we are inferring internal behavior strictly from API responses. We have, however, definitively ruled out searchable: false as the culprit.

What We Can State with Confidence

Based on sandbox testing, here is what the data actually shows:

Observation Evidence / Context
Failure is isolated to add_smart_list_rule Standard fields like Marketing Suspended and Email Invalid fail at the initial creation step. The API rejects the request before a rule instance is even generated for an update.
Custom booleans successfully use the two-step flow A custom boolean field like Engaged in Comms (isCustom: true, type: custom) successfully executed the add →  update (["true"]) sequence.
searchable status is a red herring Both system booleans and working custom booleans return searchable: false in describe_lead. It is not the gatekeeper.
The behavior splits by field class, not data type System fields (isCustom: false, type: "standard") fail, while Custom/SFDC fields (isCustom: true, type: "custom") succeed.


Key Takeaway: The issue isn’t a blanket failure of "booleans via API"—it is specifically isolated to standard/system booleans.

Evaluating Your Hypothesis

The Two-Step Flow Theory:

  1. add_smart_list_rule →  Instantiates an empty "shell" rule.

  2. update_smart_list_rule → Applies the operator and value.

This aligns perfectly with Marketo Asset API design and explains our results:

  • Strings (e.g., City): An empty shell is valid →  add succeeds (value is populated later or left null).

  • Custom Booleans: The shell likely defaults safely to false →  add succeeds →  update to true works on Engaged in Comms.

  • System Booleans (e.g., Marketing Suspended): Because these are compliance/governance fields, Marketo may not allow a temporary or "unset" state  →  add immediately throws 709 Smart List Rule Type Unsupported.

Verdict: This is a highly coherent, plausible model that fits our sandbox testing perfectly. However, because we only see the API surface, we cannot verify if this is the exact validation logic running server-side.

Alternate (or Complementary) Possibilities

  1. Explicit API Blocklist for Compliance Fields: Marketo may hard-block programmatic rule creation on sensitive system IDs—like 85 (Marketing Suspended) or 79 (Unsubscribed)—purely for data governance, regardless of the payload state.

  2. Product Policy on Standard Fields: The gate might simply be a rigid product policy split based on isCustom: false / type: "standard".

  3. UI vs. REST Validation Paths: The Marketo UI creates rules and assigns values in a single transaction. The REST API forces a two-step process (add then update). System fields might strictly require the single-shot validation path native to the UI.

  4. Misleading Error Code: 709 Smart List Rule Type Unsupported is notoriously generic and likely just means "this specific field attribute cannot be initiated via this endpoint," rather than the data type itself being unsupported.

How We Prove or Disprove It

To narrow this down, here is how different scenarios would play out against the two leading theories:

Test Scenario If "Empty-Shell" Hypothesis is Right If "Hard Governance Block" is Right
Add Marketing Suspended via API (Empty) Fails (Current Behavior) Fails (Current Behavior)
Create rule in UI, then attempt API update_smart_list_rule Update succeeds (shell already exists) Update fails (field is completely blocked)
Add a new custom boolean via API Works (Engaged in Comms baseline) Works
Add a non-compliance standard boolean via API May work if an empty state is allowed Fails if all standard fields are restricted

 

Next Step: The UI-create + API-update test on a system field like Marketing Suspended is the cleanest experiment to run next.

 

Practical Takeaways:

  • For Custom/SFDC Booleans: You can confidently use the add_smart_list_rule →  update_smart_list_rule workflow (confirmed via Engaged in Comms).

  • For System/Compliance Fields: Treat these as UI-only for rule creation until we verify if the API allows updates to pre-existing UI rules.

  • Ignore searchable: false: Do not use this parameter in your describe_lead schema to predict whether a field will work with the Asset API.

Bottom Line: Your empty-rule/unset-state explanation is the most functionally accurate mental model we have for debugging this behavior. The only remaining question mark is whether Marketo enforces a hard block on standard fields even when a value is supplied—a path we can't easily test since the API doesn't support a single-shot "add-with-value" payload.

Found this helpful? Mark the thread as solved so other community members can quickly locate the answer.