{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Known issues & workarounds"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"known-issues--workarounds","__idx":0},"children":["Known issues & workarounds"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Practical notes for calling the Grinfi LeadGen API, especially when building"," ","automations (flows) programmatically. Each item has a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["workaround"]}," you can apply"," ","today — none of these block automation building."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["Last reviewed: 2026-07-22"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1-validate-node-requires-before-and-after-even-when-empty","__idx":1},"children":["1. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["validate-node"]}," requires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["before"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]}," (even when empty)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /flows/api/flow-versions/validate-node"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sending a node without the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["before"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]}," edge arrays returns a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["500"]}," instead"," ","of a validation error. This is independent of the node ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," — it happens for every"," ","type when those fields are missing."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workaround:"]}," always include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["before"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]},", using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[]"]}," when the node has no"," ","edges yet. Send the full node object (the same shape you would store in a flow version):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": 1,\n  \"before\": [],\n  \"after\": [],\n  \"type\": \"linkedin_send_connection_request\",\n  \"automation\": \"auto\",\n  \"payload\": { \"template\": \"Hi {{first_name}}!\", \"fallback_send\": true, \"template_uuid\": null },\n  \"delay_in_seconds\": 0\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A valid node returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["204 No Content"]},"."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note: the node config goes in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payload"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["automation"]}," set to the string ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"auto\""]},"."," ","The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flow-node"]}," schema in the OpenAPI spec lists the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payload"]}," shape for all node types."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2-flow-lead-filters-reject-unknown-field-names-with-a-500","__idx":2},"children":["2. Flow-lead filters reject unknown field names with a 500"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /flows/api/flows-leads/list"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Passing a filter field that doesn't exist (e.g. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flow_uuids"]},") returns a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["500"]}," instead"," ","of a validation error."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workaround:"]}," use the documented filter field names. The flow filter is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flow_uuid"]}," ","(singular, array-valued):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{ \"filter\": { \"flow_uuid\": [\"3a4ac30b-1321-449c-9b37-e9fe3174e00e\"] }, \"limit\": 20 }\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Supported ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter"]}," keys: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flow_uuid"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lead_uuid"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," (all arrays)."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"3-flows-built-via-api-may-not-open-in-the-web-editor","__idx":3},"children":["3. Flows built via API may not open in the web editor"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Flows created through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /flows/api/flows/{flowUuid}/flow-versions"]}," run correctly, but"," ","the visual editor (Automations page) enforces extra layout invariants beyond what"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["validate-node"]}," checks. If a programmatically built flow fails to open in the editor,"," ","check that the node tree satisfies these:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["first_common_node_id"]}," must be set"]}," whenever the flow branches. In editor-created"," ","flows this field is populated in virtually every version (211/213 sampled) — it points"," ","to the node where the branches reconverge. Sending ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," (or omitting it) on a"," ","branching tree is the most common reason a valid, runnable flow won't render. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," ","only for a purely linear tree. Always round-trip this field when you read a version back"," ","and re-save it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Symmetric edges"]}," — for every ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]}," edge ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{node_id: B}"]}," on node A, node B has a"," ","matching ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["before"]}," edge ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{node_id: A}"]}," with the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["branch_id"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Consistent ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["branch_id"]},"s"]}," — linear steps use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]},"; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rule_ab_test"]}," uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2"]},";"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rule_filter"]}," uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]}," (match) and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]}," (else); triggers use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Every branch ends in an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end"]}," node."]}," A flow may have several ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end"]}," nodes (one per"," ","branch tail), and branches may reconverge into a shared ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end"]}," — both are valid. What"," ","matters is that no branch is left dangling."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["No node coordinates are needed"]}," — nodes carry no x/y or layout fields; the editor"," ","derives the layout from the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["before"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]}," graph plus ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["first_common_node_id"]},". These are"," ","editor-only invariants; the API runs the flow without them. If a tree runs but won't open"," ","visually, the cause is almost always a missing/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["first_common_node_id"]}," on a"," ","branching flow, or an asymmetric ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["before"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after"]}," edge."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"4-createflowversion-rejects-an-empty-contact_sources-array","__idx":4},"children":["4. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createFlowVersion"]}," rejects an empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["contact_sources"]}," array"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /flows/api/flows/{flowUuid}/flow-versions"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sending ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["contact_sources: []"]}," returns a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["422"]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"The contact sources field is required.\""]}," (verified on prod 2026-07-22). There is no way to save a version with a"," ","truly empty audience list."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workaround:"]}," always send at least one source. For a version with no audience yet,"," ","send the same default source the backend itself auto-creates with every new flow shell"," ","(see below) — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sender_profiles: []"]}," means no senders are attached, so nothing runs:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": 1,\n  \"name\": null,\n  \"rotation_strategy\": \"fair\",\n  \"sender_profiles\": [],\n  \"after_id\": 3,\n  \"mass_actions_filter\": null,\n  \"filter_tree_format\": null\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after_id"]}," points at the tree's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["entry node"]}," (the first step leads execute — the node"," ","with no incoming ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["before"]}," edges)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Related quirk (useful, not a bug):"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /flows/api/flows"]}," auto-creates an initial"," ","flow version for the new shell — a single ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end"]}," node plus exactly this default contact"," ","source (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["after_id"]}," pointing at the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end"]}," node). A fresh draft therefore already has a"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["flow_version_uuid"]}," before you save anything; your first ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createFlowVersion"]}," adds a"," ","second version that replaces it."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"5-creating-an-ai-template-requires-is_public","__idx":5},"children":["5. Creating an AI Template requires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_public"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /flows/api/ai-templates"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Omitting ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_public"]}," returns a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["500"]}," (a backend type error — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_public"]}," reaches the"," ","domain constructor as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},") instead of a validation error."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workaround:"]}," always send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["is_public"]}," as an integer — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["1"]}," (team-visible) or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]}," ","(private). Minimal working create body: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"name\": \"...\", \"type\": \"message\", \"is_public\": 1 }"]},"."," ","Valid ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," values: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["connection_note"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["post_comment"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"6-deleted-ai-templates-still-show-up-in-the-api-read-path-ignores-soft-delete","__idx":6},"children":["6. Deleted AI Templates still show up in the API (read path ignores soft-delete)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /flows/api/ai-templates/{uuid}"]}," (+ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["List"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Get"]},")"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE"]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["204"]}," and the template ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["does"]}," get removed — it disappears from the web"," ","app. But the API read path does not filter it out: after deletion the template still"," ","resolves on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /flows/api/ai-templates/{uuid}"]}," and still appears in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["List AI Templates"]}," ","(verified 2026-07-22). Deletion looks like a soft-delete that only the UI honors."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workaround:"]}," treat a template as deleted as soon as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE"]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["204"]},". Do ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," ","use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["List"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET"]}," to confirm removal — they will still show the deleted record. If you need"," ","a reliable \"is this alive?\" check, track deletions on your side until the backend filters"," ","soft-deleted rows from the read endpoints. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST"]}," (create) and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT"]}," (update) work normally."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"7-flat-query-filters-are-silently-ignored--use-filter","__idx":7},"children":["7. Flat query filters are silently ignored — use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter[...]"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoints:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /flows/api/tasks"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /flows/api/linkedin-conversations"]},", and other"," ","list endpoints backed by a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["*Filter"]}," class."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Passing a filter as a flat query param (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?type="]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?status="]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?flow_uuid="]},") is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["silently"," ","ignored"]}," — you get unfiltered results with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]},", which is easy to mistake for real data."," ","Measured on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/flows/api/tasks"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["?type=linkedin_send_connection_request"]}," returned the same"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["total"]}," (1,245,527) as no filter at all; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter[type]=…"]}," returned 254,654."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Workaround:"]}," always use the bracket form, URL-encoded:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET /flows/api/tasks?limit=1\n  &filter%5Bflow_uuid%5D=<uuid>\n  &filter%5Btype%5D=linkedin_send_connection_request\n  &filter%5Bstatus%5D=closed\n  &filter%5Bexecuted_at%5D%5B%3E%3D%5D=2026-07-22\n  &filter%5Bexecuted_at%5D%5B%3C%3D%5D=2026-07-23\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Notes:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Date ranges use comparison operators ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["inside"]}," the field: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter[executed_at][>=]"]},","," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter[executed_at][<=]"]},". Range-style field names (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["executed_at_from"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["date_start"]},", …)"," ","are not valid and return a 500 (see §2 — unknown filter keys throw instead of 422)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Read ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["total"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limit=1"]}," to count without paging."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Narrow your query."]}," Unfiltered or broad reporting queries over large task volumes can"," ","return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["504 Gateway Timeout"]},"; adding ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["filter[flow_uuid]"]}," keeps them ~1s."]}]}]},"headings":[{"value":"Known issues & workarounds","id":"known-issues--workarounds","depth":1},{"value":"1. validate-node requires before and after (even when empty)","id":"1-validate-node-requires-before-and-after-even-when-empty","depth":2},{"value":"2. Flow-lead filters reject unknown field names with a 500","id":"2-flow-lead-filters-reject-unknown-field-names-with-a-500","depth":2},{"value":"3. Flows built via API may not open in the web editor","id":"3-flows-built-via-api-may-not-open-in-the-web-editor","depth":2},{"value":"4. createFlowVersion rejects an empty contact_sources array","id":"4-createflowversion-rejects-an-empty-contact_sources-array","depth":2},{"value":"5. Creating an AI Template requires is_public","id":"5-creating-an-ai-template-requires-is_public","depth":2},{"value":"6. Deleted AI Templates still show up in the API (read path ignores soft-delete)","id":"6-deleted-ai-templates-still-show-up-in-the-api-read-path-ignores-soft-delete","depth":2},{"value":"7. Flat query filters are silently ignored — use filter[...]","id":"7-flat-query-filters-are-silently-ignored--use-filter","depth":2}],"frontmatter":{"seo":{"title":"Known issues & workarounds"}},"lastModified":"2026-07-22T14:28:36.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/known_issues","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}