{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/heykairon-com/json-schema/heykairon-com-campaign-draft-dto-schema.json",
  "title": "CampaignDraftDto",
  "x-generated": "2026-11-11",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/heykairon-com-openapi.yml#/components/schemas/CampaignDraftDto",
  "type": "object",
  "properties": {
    "nodes": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "send_invite",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "note": {
                    "default": "",
                    "description": "Invite note, and the seed when `draftMode` is `ai_template`. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`. Custom list columns reach a message two ways: `{{@columnName}}` sends that column's value word for word, and a normal AI slot that mentions a column can use it as a fact, written in the writer's own words. At publish it must be ≤300 characters, or ≤250 once it contains any `{{token}}` (the braces count), leaving room for what the token expands to. Over that, publish fails with `invite_note_too_long`. A note needs a sender with LinkedIn Premium or Sales Navigator (`canSendInviteNote` on `seat_list`); on any other seat leave it empty — `campaign_set_graph` refuses a note there.",
                    "type": "string",
                    "maxLength": 2000
                  },
                  "draftMode": {
                    "description": "How the copy is produced. `template`: sent as written — only allowlisted `{{variables}}` and per-lead `{{@slots}}` are substituted, no AI. `ai_template`: the AI personalizes YOUR seed, filling its `{{described slots}}` and nothing else. Absent means `template`.",
                    "type": "string",
                    "enum": [
                      "template",
                      "ai_template"
                    ]
                  },
                  "instruction": {
                    "description": "Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                    "type": "string",
                    "maxLength": 4000
                  },
                  "language": {
                    "description": "Force every message on this step into one language, or set 'auto' so each lead is written to in their OWN language, translating your seed faithfully. OMIT IT and the step uses the default language the sender chose in their settings, or 'auto' when they chose none — which is usually what you want. This rule outranks the seed's original language.",
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "auto"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ]
                      }
                    ]
                  },
                  "localization": {
                    "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                    "type": "object",
                    "properties": {
                      "seedHash": {
                        "type": "string",
                        "minLength": 1,
                        "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                      },
                      "seedLanguage": {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ],
                        "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                      },
                      "translations": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "enum": [
                            "aa",
                            "ab",
                            "ae",
                            "af",
                            "ak",
                            "am",
                            "an",
                            "ar",
                            "as",
                            "av",
                            "ay",
                            "az",
                            "ba",
                            "be",
                            "bg",
                            "bh",
                            "bi",
                            "bm",
                            "bn",
                            "bo",
                            "br",
                            "bs",
                            "ca",
                            "ce",
                            "ch",
                            "co",
                            "cr",
                            "cs",
                            "cu",
                            "cv",
                            "cy",
                            "da",
                            "de",
                            "dv",
                            "dz",
                            "ee",
                            "el",
                            "en",
                            "eo",
                            "es",
                            "et",
                            "eu",
                            "fa",
                            "ff",
                            "fi",
                            "fj",
                            "fo",
                            "fr",
                            "fy",
                            "ga",
                            "gd",
                            "gl",
                            "gn",
                            "gu",
                            "gv",
                            "ha",
                            "he",
                            "hi",
                            "ho",
                            "hr",
                            "ht",
                            "hu",
                            "hy",
                            "hz",
                            "ia",
                            "id",
                            "ie",
                            "ig",
                            "ii",
                            "ik",
                            "io",
                            "is",
                            "it",
                            "iu",
                            "ja",
                            "jv",
                            "ka",
                            "kg",
                            "ki",
                            "kj",
                            "kk",
                            "kl",
                            "km",
                            "kn",
                            "ko",
                            "kr",
                            "ks",
                            "ku",
                            "kv",
                            "kw",
                            "ky",
                            "la",
                            "lb",
                            "lg",
                            "li",
                            "ln",
                            "lo",
                            "lt",
                            "lu",
                            "lv",
                            "mg",
                            "mh",
                            "mi",
                            "mk",
                            "ml",
                            "mn",
                            "mr",
                            "ms",
                            "mt",
                            "my",
                            "na",
                            "nb",
                            "nd",
                            "ne",
                            "ng",
                            "nl",
                            "nn",
                            "no",
                            "nr",
                            "nv",
                            "ny",
                            "oc",
                            "oj",
                            "om",
                            "or",
                            "os",
                            "pa",
                            "pi",
                            "pl",
                            "ps",
                            "pt",
                            "qu",
                            "rm",
                            "rn",
                            "ro",
                            "ru",
                            "rw",
                            "sa",
                            "sc",
                            "sd",
                            "se",
                            "sg",
                            "si",
                            "sk",
                            "sl",
                            "sm",
                            "sn",
                            "so",
                            "sq",
                            "sr",
                            "ss",
                            "st",
                            "su",
                            "sv",
                            "sw",
                            "ta",
                            "te",
                            "tg",
                            "th",
                            "ti",
                            "tk",
                            "tl",
                            "tn",
                            "to",
                            "tr",
                            "ts",
                            "tt",
                            "tw",
                            "ty",
                            "ug",
                            "uk",
                            "ur",
                            "uz",
                            "ve",
                            "vi",
                            "vo",
                            "wa",
                            "wo",
                            "xh",
                            "yi",
                            "yo",
                            "za",
                            "zh",
                            "zu"
                          ]
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1
                        },
                        "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                      }
                    },
                    "required": [
                      "seedHash",
                      "seedLanguage",
                      "translations"
                    ]
                  },
                  "reviewBeforeSend": {
                    "description": "Default false. True holds every send this step drafts for the operator to approve, even when the campaign is on autopilot. Nothing is scheduled until they approve it.",
                    "type": "boolean"
                  },
                  "verifyBeforeSend": {
                    "description": "DEPRECATED, and accepted only so campaigns published before the rename still parse. Set `reviewBeforeSend` instead; if both are present the new one wins.",
                    "type": "boolean"
                  },
                  "adaptToCulture": {
                    "description": "Retired: accepted for old steps and ignored. Do not send it.",
                    "type": "boolean"
                  }
                },
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "wait_connection_accepted",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "timeoutDays": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30,
                    "description": "How many whole days to wait for the invite to be accepted, 1-30. On expiry the run leaves by the `timeout` edge; wire one or those leads stop here."
                  },
                  "withdrawOnTimeout": {
                    "description": "Withdraw the pending invite when the wait times out. Default true — it reclaims LinkedIn pending-invite quota, which is capped. Set false to leave the invite standing, so someone who accepts weeks later still lands on the `accepted` edge of a later wait.",
                    "type": "boolean"
                  }
                },
                "required": [
                  "timeoutDays"
                ],
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "delay",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "value": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 43200,
                    "description": "How long to pause before the next step, counted in `unit`. The total may not exceed 30 days."
                  },
                  "unit": {
                    "type": "string",
                    "enum": [
                      "minutes",
                      "hours",
                      "days"
                    ],
                    "description": "The unit `value` is counted in. Use `minutes`/`hours` for the hot follow-up right after an invite is accepted, `days` for a nurture gap. Counted in real time, not send windows — the next step then waits for the window to open."
                  }
                },
                "required": [
                  "value",
                  "unit"
                ],
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "wait_reply",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "value": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 43200,
                    "description": "How long to wait for the lead to reply, counted in `unit`. The total may not exceed 30 days."
                  },
                  "unit": {
                    "type": "string",
                    "enum": [
                      "minutes",
                      "hours",
                      "days"
                    ],
                    "description": "The unit `value` is counted in. `minutes`/`hours` for a same-day nudge, `days` for a normal follow-up gap."
                  }
                },
                "required": [
                  "value",
                  "unit"
                ],
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "agentic_reply",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "instruction": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 8000,
                    "description": "REQUIRED. The goal — what the operator wants out of this conversation, in one line. E.g. \"Get them to book a call with me.\" or \"Find out if they own hiring, or who does.\" This is the only field the step needs: the agent chooses its own wording and works out for itself when the conversation is finished. It does NOT invent substance — anything it cannot answer straight from this goal and `additionalInstructions` is handed to a human instead, so the more `additionalInstructions` says, the fewer turns come back to the operator."
                  },
                  "additionalInstructions": {
                    "default": "",
                    "description": "Optional, and it decides how much the agent can answer on its own: it hands a turn to a human whenever the answer is not straightforward from the goal plus this field. Put here the facts it may use (dates, what things cost, links — STATE EVERY ONE, it must never state a fact you did not give it), when to treat the conversation as finished, what to hand straight to a human whatever it knows, how to answer an objection you expect, and any other steering. E.g. \"The event is Tuesday 12 March, 6pm, at our office. If they ask who else is going, hand it to me. If they say it is too far, offer the recording.\"",
                    "type": "string",
                    "maxLength": 8000
                  },
                  "silence": {
                    "default": {
                      "value": 7,
                      "unit": "days"
                    },
                    "description": "How long the agent keeps listening — for her FIRST reply, and after each of its own answers. She goes quiet past this and the step leaves by `no_reply`, so a follow-up can still chase her.",
                    "type": "object",
                    "properties": {
                      "value": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 43200,
                        "description": "How long to keep listening for her next message, counted in `unit`. The total may not exceed 30 days."
                      },
                      "unit": {
                        "type": "string",
                        "enum": [
                          "minutes",
                          "hours",
                          "days"
                        ],
                        "description": "The unit `value` is counted in."
                      }
                    },
                    "required": [
                      "value",
                      "unit"
                    ]
                  },
                  "maxTurns": {
                    "description": "How many times the agent may answer before it hands off for good and the run ends. Defaults to 10.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20
                  },
                  "nudges": {
                    "description": "How many follow-ups the agent writes itself when she goes quiet after one of its answers — one per `silence` window, each read from the whole chat. It may decide a follow-up would be pushy and leave by `no_reply` instead. Each counts against `maxTurns`. No nudge after a handoff, a goodbye, a takeover by hand, when she never replied at all, or when the lead is at Meeting booked, On hold, Won, Lost or Discarded. Without the sending seat's own working calendar, a booking link sent (or her \"I'll book\") counts as possibly booked, and the agent leaves by `no_reply` instead of nudging. 0 (the default) leaves by `no_reply` at the first silence. At most 3.",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 3
                  },
                  "attachments": {
                    "description": "Files the agent may send with an answer when they fit the conversation — each at most once per conversation. Say in the instruction when to send which. Images and PDFs; on LinkedIn also one voice note and one video.",
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "storageKey": {
                          "type": "string",
                          "maxLength": 512,
                          "pattern": "^step-attachments\\/.*",
                          "description": "Where Kairon keeps the file. Send it back as the step returned it."
                        },
                        "fileName": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file name the lead sees."
                        },
                        "mimeType": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file type, for example application/pdf."
                        },
                        "byteSize": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991,
                          "description": "The file size in bytes."
                        }
                      },
                      "required": [
                        "storageKey",
                        "fileName",
                        "mimeType",
                        "byteSize"
                      ],
                      "additionalProperties": false
                    }
                  }
                },
                "required": [
                  "instruction"
                ],
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "send_message",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "body": {
                    "default": "",
                    "description": "The message. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`. Custom list columns reach a message two ways: `{{@columnName}}` sends that column's value word for word, and a normal AI slot that mentions a column can use it as a fact, written in the writer's own words. To send this as SEVERAL messages rather than one, separate them with a line containing only `---`. Each part arrives as its own LinkedIn message a couple of seconds later, in the same conversation — what a person does when they type a short opener and then the reason they wrote. The whole thing still counts as ONE send against the daily limit. This is the same thing the \"Add bubble\" button does in the campaign editor.",
                    "type": "string",
                    "maxLength": 8000
                  },
                  "draftMode": {
                    "description": "How the copy is produced. `template`: sent as written — only allowlisted `{{variables}}` and per-lead `{{@slots}}` are substituted, no AI. `ai_template`: the AI personalizes YOUR seed, filling its `{{described slots}}` and nothing else. Absent means `template`.",
                    "type": "string",
                    "enum": [
                      "template",
                      "ai_template"
                    ]
                  },
                  "instruction": {
                    "description": "Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                    "type": "string",
                    "maxLength": 4000
                  },
                  "language": {
                    "description": "Force every message on this step into one language, or set 'auto' so each lead is written to in their OWN language, translating your seed faithfully. OMIT IT and the step uses the default language the sender chose in their settings, or 'auto' when they chose none — which is usually what you want. This rule outranks the seed's original language.",
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "auto"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ]
                      }
                    ]
                  },
                  "localization": {
                    "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                    "type": "object",
                    "properties": {
                      "seedHash": {
                        "type": "string",
                        "minLength": 1,
                        "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                      },
                      "seedLanguage": {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ],
                        "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                      },
                      "translations": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "enum": [
                            "aa",
                            "ab",
                            "ae",
                            "af",
                            "ak",
                            "am",
                            "an",
                            "ar",
                            "as",
                            "av",
                            "ay",
                            "az",
                            "ba",
                            "be",
                            "bg",
                            "bh",
                            "bi",
                            "bm",
                            "bn",
                            "bo",
                            "br",
                            "bs",
                            "ca",
                            "ce",
                            "ch",
                            "co",
                            "cr",
                            "cs",
                            "cu",
                            "cv",
                            "cy",
                            "da",
                            "de",
                            "dv",
                            "dz",
                            "ee",
                            "el",
                            "en",
                            "eo",
                            "es",
                            "et",
                            "eu",
                            "fa",
                            "ff",
                            "fi",
                            "fj",
                            "fo",
                            "fr",
                            "fy",
                            "ga",
                            "gd",
                            "gl",
                            "gn",
                            "gu",
                            "gv",
                            "ha",
                            "he",
                            "hi",
                            "ho",
                            "hr",
                            "ht",
                            "hu",
                            "hy",
                            "hz",
                            "ia",
                            "id",
                            "ie",
                            "ig",
                            "ii",
                            "ik",
                            "io",
                            "is",
                            "it",
                            "iu",
                            "ja",
                            "jv",
                            "ka",
                            "kg",
                            "ki",
                            "kj",
                            "kk",
                            "kl",
                            "km",
                            "kn",
                            "ko",
                            "kr",
                            "ks",
                            "ku",
                            "kv",
                            "kw",
                            "ky",
                            "la",
                            "lb",
                            "lg",
                            "li",
                            "ln",
                            "lo",
                            "lt",
                            "lu",
                            "lv",
                            "mg",
                            "mh",
                            "mi",
                            "mk",
                            "ml",
                            "mn",
                            "mr",
                            "ms",
                            "mt",
                            "my",
                            "na",
                            "nb",
                            "nd",
                            "ne",
                            "ng",
                            "nl",
                            "nn",
                            "no",
                            "nr",
                            "nv",
                            "ny",
                            "oc",
                            "oj",
                            "om",
                            "or",
                            "os",
                            "pa",
                            "pi",
                            "pl",
                            "ps",
                            "pt",
                            "qu",
                            "rm",
                            "rn",
                            "ro",
                            "ru",
                            "rw",
                            "sa",
                            "sc",
                            "sd",
                            "se",
                            "sg",
                            "si",
                            "sk",
                            "sl",
                            "sm",
                            "sn",
                            "so",
                            "sq",
                            "sr",
                            "ss",
                            "st",
                            "su",
                            "sv",
                            "sw",
                            "ta",
                            "te",
                            "tg",
                            "th",
                            "ti",
                            "tk",
                            "tl",
                            "tn",
                            "to",
                            "tr",
                            "ts",
                            "tt",
                            "tw",
                            "ty",
                            "ug",
                            "uk",
                            "ur",
                            "uz",
                            "ve",
                            "vi",
                            "vo",
                            "wa",
                            "wo",
                            "xh",
                            "yi",
                            "yo",
                            "za",
                            "zh",
                            "zu"
                          ]
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1
                        },
                        "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                      }
                    },
                    "required": [
                      "seedHash",
                      "seedLanguage",
                      "translations"
                    ]
                  },
                  "reviewBeforeSend": {
                    "description": "Default false. True holds every send this step drafts for the operator to approve, even when the campaign is on autopilot. Nothing is scheduled until they approve it.",
                    "type": "boolean"
                  },
                  "verifyBeforeSend": {
                    "description": "DEPRECATED, and accepted only so campaigns published before the rename still parse. Set `reviewBeforeSend` instead; if both are present the new one wins.",
                    "type": "boolean"
                  },
                  "adaptToCulture": {
                    "description": "Retired: accepted for old steps and ignored. Do not send it.",
                    "type": "boolean"
                  },
                  "condition": {
                    "description": "Only send when one of their own recent posts meets this test - e.g. \"a new job or a promotion\". The newest post that meets it becomes what the message refers to; a post that is bad news for its author never meets it. When none does, the step is SKIPPED and the lead moves on; nothing is sent. Omit it and the message sends as usual.",
                    "type": "string",
                    "maxLength": 1000
                  },
                  "maxPostAgeDays": {
                    "description": "With a condition: Only consider their own posts from the last this-many days, 1-90. Defaults to 90. In a loop, the step also only considers posts published after it last acted on a post, or last checked and found none that met its condition.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 90
                  },
                  "bySender": {
                    "description": "Optional per-sender text, keyed by the sender's user id (`seat_list` → `ownerUserId`). A lead sent by that sender gets this version; every other sender gets the step's own `body`. Same draft mode and language as the step.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "object",
                      "properties": {
                        "body": {
                          "type": "string",
                          "maxLength": 8000,
                          "description": "This sender's message, in place of the step's `body`. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`."
                        },
                        "instruction": {
                          "description": "This sender's note, in place of the step's `instruction`. Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                          "type": "string",
                          "maxLength": 4000
                        },
                        "localization": {
                          "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                          "type": "object",
                          "properties": {
                            "seedHash": {
                              "type": "string",
                              "minLength": 1,
                              "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                            },
                            "seedLanguage": {
                              "type": "string",
                              "enum": [
                                "aa",
                                "ab",
                                "ae",
                                "af",
                                "ak",
                                "am",
                                "an",
                                "ar",
                                "as",
                                "av",
                                "ay",
                                "az",
                                "ba",
                                "be",
                                "bg",
                                "bh",
                                "bi",
                                "bm",
                                "bn",
                                "bo",
                                "br",
                                "bs",
                                "ca",
                                "ce",
                                "ch",
                                "co",
                                "cr",
                                "cs",
                                "cu",
                                "cv",
                                "cy",
                                "da",
                                "de",
                                "dv",
                                "dz",
                                "ee",
                                "el",
                                "en",
                                "eo",
                                "es",
                                "et",
                                "eu",
                                "fa",
                                "ff",
                                "fi",
                                "fj",
                                "fo",
                                "fr",
                                "fy",
                                "ga",
                                "gd",
                                "gl",
                                "gn",
                                "gu",
                                "gv",
                                "ha",
                                "he",
                                "hi",
                                "ho",
                                "hr",
                                "ht",
                                "hu",
                                "hy",
                                "hz",
                                "ia",
                                "id",
                                "ie",
                                "ig",
                                "ii",
                                "ik",
                                "io",
                                "is",
                                "it",
                                "iu",
                                "ja",
                                "jv",
                                "ka",
                                "kg",
                                "ki",
                                "kj",
                                "kk",
                                "kl",
                                "km",
                                "kn",
                                "ko",
                                "kr",
                                "ks",
                                "ku",
                                "kv",
                                "kw",
                                "ky",
                                "la",
                                "lb",
                                "lg",
                                "li",
                                "ln",
                                "lo",
                                "lt",
                                "lu",
                                "lv",
                                "mg",
                                "mh",
                                "mi",
                                "mk",
                                "ml",
                                "mn",
                                "mr",
                                "ms",
                                "mt",
                                "my",
                                "na",
                                "nb",
                                "nd",
                                "ne",
                                "ng",
                                "nl",
                                "nn",
                                "no",
                                "nr",
                                "nv",
                                "ny",
                                "oc",
                                "oj",
                                "om",
                                "or",
                                "os",
                                "pa",
                                "pi",
                                "pl",
                                "ps",
                                "pt",
                                "qu",
                                "rm",
                                "rn",
                                "ro",
                                "ru",
                                "rw",
                                "sa",
                                "sc",
                                "sd",
                                "se",
                                "sg",
                                "si",
                                "sk",
                                "sl",
                                "sm",
                                "sn",
                                "so",
                                "sq",
                                "sr",
                                "ss",
                                "st",
                                "su",
                                "sv",
                                "sw",
                                "ta",
                                "te",
                                "tg",
                                "th",
                                "ti",
                                "tk",
                                "tl",
                                "tn",
                                "to",
                                "tr",
                                "ts",
                                "tt",
                                "tw",
                                "ty",
                                "ug",
                                "uk",
                                "ur",
                                "uz",
                                "ve",
                                "vi",
                                "vo",
                                "wa",
                                "wo",
                                "xh",
                                "yi",
                                "yo",
                                "za",
                                "zh",
                                "zu"
                              ],
                              "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                            },
                            "translations": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string",
                                "enum": [
                                  "aa",
                                  "ab",
                                  "ae",
                                  "af",
                                  "ak",
                                  "am",
                                  "an",
                                  "ar",
                                  "as",
                                  "av",
                                  "ay",
                                  "az",
                                  "ba",
                                  "be",
                                  "bg",
                                  "bh",
                                  "bi",
                                  "bm",
                                  "bn",
                                  "bo",
                                  "br",
                                  "bs",
                                  "ca",
                                  "ce",
                                  "ch",
                                  "co",
                                  "cr",
                                  "cs",
                                  "cu",
                                  "cv",
                                  "cy",
                                  "da",
                                  "de",
                                  "dv",
                                  "dz",
                                  "ee",
                                  "el",
                                  "en",
                                  "eo",
                                  "es",
                                  "et",
                                  "eu",
                                  "fa",
                                  "ff",
                                  "fi",
                                  "fj",
                                  "fo",
                                  "fr",
                                  "fy",
                                  "ga",
                                  "gd",
                                  "gl",
                                  "gn",
                                  "gu",
                                  "gv",
                                  "ha",
                                  "he",
                                  "hi",
                                  "ho",
                                  "hr",
                                  "ht",
                                  "hu",
                                  "hy",
                                  "hz",
                                  "ia",
                                  "id",
                                  "ie",
                                  "ig",
                                  "ii",
                                  "ik",
                                  "io",
                                  "is",
                                  "it",
                                  "iu",
                                  "ja",
                                  "jv",
                                  "ka",
                                  "kg",
                                  "ki",
                                  "kj",
                                  "kk",
                                  "kl",
                                  "km",
                                  "kn",
                                  "ko",
                                  "kr",
                                  "ks",
                                  "ku",
                                  "kv",
                                  "kw",
                                  "ky",
                                  "la",
                                  "lb",
                                  "lg",
                                  "li",
                                  "ln",
                                  "lo",
                                  "lt",
                                  "lu",
                                  "lv",
                                  "mg",
                                  "mh",
                                  "mi",
                                  "mk",
                                  "ml",
                                  "mn",
                                  "mr",
                                  "ms",
                                  "mt",
                                  "my",
                                  "na",
                                  "nb",
                                  "nd",
                                  "ne",
                                  "ng",
                                  "nl",
                                  "nn",
                                  "no",
                                  "nr",
                                  "nv",
                                  "ny",
                                  "oc",
                                  "oj",
                                  "om",
                                  "or",
                                  "os",
                                  "pa",
                                  "pi",
                                  "pl",
                                  "ps",
                                  "pt",
                                  "qu",
                                  "rm",
                                  "rn",
                                  "ro",
                                  "ru",
                                  "rw",
                                  "sa",
                                  "sc",
                                  "sd",
                                  "se",
                                  "sg",
                                  "si",
                                  "sk",
                                  "sl",
                                  "sm",
                                  "sn",
                                  "so",
                                  "sq",
                                  "sr",
                                  "ss",
                                  "st",
                                  "su",
                                  "sv",
                                  "sw",
                                  "ta",
                                  "te",
                                  "tg",
                                  "th",
                                  "ti",
                                  "tk",
                                  "tl",
                                  "tn",
                                  "to",
                                  "tr",
                                  "ts",
                                  "tt",
                                  "tw",
                                  "ty",
                                  "ug",
                                  "uk",
                                  "ur",
                                  "uz",
                                  "ve",
                                  "vi",
                                  "vo",
                                  "wa",
                                  "wo",
                                  "xh",
                                  "yi",
                                  "yo",
                                  "za",
                                  "zh",
                                  "zu"
                                ]
                              },
                              "additionalProperties": {
                                "type": "string",
                                "minLength": 1
                              },
                              "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                            }
                          },
                          "required": [
                            "seedHash",
                            "seedLanguage",
                            "translations"
                          ]
                        }
                      },
                      "required": [
                        "body"
                      ]
                    }
                  },
                  "attachments": {
                    "description": "Files sent with this step to every lead it reaches: images and PDFs, plus one voice note and one video on a LinkedIn message.",
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "storageKey": {
                          "type": "string",
                          "maxLength": 512,
                          "pattern": "^step-attachments\\/.*",
                          "description": "Where Kairon keeps the file. Send it back as the step returned it."
                        },
                        "fileName": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file name the lead sees."
                        },
                        "mimeType": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file type, for example application/pdf."
                        },
                        "byteSize": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991,
                          "description": "The file size in bytes."
                        }
                      },
                      "required": [
                        "storageKey",
                        "fileName",
                        "mimeType",
                        "byteSize"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "attachmentsBySender": {
                    "description": "Optional per-sender files, keyed by the sender's user id (`seat_list` → `ownerUserId`): that sender's leads get these files instead of the step's `attachments` (an empty list sends none). Read-only notes — add files through `attachments` first.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "maxItems": 5,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "storageKey": {
                            "type": "string",
                            "maxLength": 512,
                            "pattern": "^step-attachments\\/.*",
                            "description": "Where Kairon keeps the file. Send it back as the step returned it."
                          },
                          "fileName": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 255,
                            "description": "The file name the lead sees."
                          },
                          "mimeType": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 255,
                            "description": "The file type, for example application/pdf."
                          },
                          "byteSize": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991,
                            "description": "The file size in bytes."
                          }
                        },
                        "required": [
                          "storageKey",
                          "fileName",
                          "mimeType",
                          "byteSize"
                        ],
                        "additionalProperties": false
                      }
                    }
                  }
                },
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "send_inmail",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "subject": {
                    "default": "",
                    "description": "Required. The InMail subject line — fixed text you write, never AI-written, in every draftMode. The only tokens allowed are template variables (firstName, lastName, companyName, jobTitle, location, headline, companyIndustry); a described slot or a per-lead {{@slot}} is refused. Empty is refused at save and at publish.",
                    "type": "string",
                    "maxLength": 200
                  },
                  "body": {
                    "default": "",
                    "description": "The InMail body. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`. Custom list columns reach a message two ways: `{{@columnName}}` sends that column's value word for word, and a normal AI slot that mentions a column can use it as a fact, written in the writer's own words.",
                    "type": "string",
                    "maxLength": 8000
                  },
                  "draftMode": {
                    "description": "How the copy is produced. `template`: sent as written — only allowlisted `{{variables}}` and per-lead `{{@slots}}` are substituted, no AI. `ai_template`: the AI personalizes YOUR seed, filling its `{{described slots}}` and nothing else. Absent means `template`.",
                    "type": "string",
                    "enum": [
                      "template",
                      "ai_template"
                    ]
                  },
                  "instruction": {
                    "description": "Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                    "type": "string",
                    "maxLength": 4000
                  },
                  "language": {
                    "description": "Force every message on this step into one language, or set 'auto' so each lead is written to in their OWN language, translating your seed faithfully. OMIT IT and the step uses the default language the sender chose in their settings, or 'auto' when they chose none — which is usually what you want. This rule outranks the seed's original language.",
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "auto"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ]
                      }
                    ]
                  },
                  "localization": {
                    "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                    "type": "object",
                    "properties": {
                      "seedHash": {
                        "type": "string",
                        "minLength": 1,
                        "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                      },
                      "seedLanguage": {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ],
                        "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                      },
                      "translations": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "enum": [
                            "aa",
                            "ab",
                            "ae",
                            "af",
                            "ak",
                            "am",
                            "an",
                            "ar",
                            "as",
                            "av",
                            "ay",
                            "az",
                            "ba",
                            "be",
                            "bg",
                            "bh",
                            "bi",
                            "bm",
                            "bn",
                            "bo",
                            "br",
                            "bs",
                            "ca",
                            "ce",
                            "ch",
                            "co",
                            "cr",
                            "cs",
                            "cu",
                            "cv",
                            "cy",
                            "da",
                            "de",
                            "dv",
                            "dz",
                            "ee",
                            "el",
                            "en",
                            "eo",
                            "es",
                            "et",
                            "eu",
                            "fa",
                            "ff",
                            "fi",
                            "fj",
                            "fo",
                            "fr",
                            "fy",
                            "ga",
                            "gd",
                            "gl",
                            "gn",
                            "gu",
                            "gv",
                            "ha",
                            "he",
                            "hi",
                            "ho",
                            "hr",
                            "ht",
                            "hu",
                            "hy",
                            "hz",
                            "ia",
                            "id",
                            "ie",
                            "ig",
                            "ii",
                            "ik",
                            "io",
                            "is",
                            "it",
                            "iu",
                            "ja",
                            "jv",
                            "ka",
                            "kg",
                            "ki",
                            "kj",
                            "kk",
                            "kl",
                            "km",
                            "kn",
                            "ko",
                            "kr",
                            "ks",
                            "ku",
                            "kv",
                            "kw",
                            "ky",
                            "la",
                            "lb",
                            "lg",
                            "li",
                            "ln",
                            "lo",
                            "lt",
                            "lu",
                            "lv",
                            "mg",
                            "mh",
                            "mi",
                            "mk",
                            "ml",
                            "mn",
                            "mr",
                            "ms",
                            "mt",
                            "my",
                            "na",
                            "nb",
                            "nd",
                            "ne",
                            "ng",
                            "nl",
                            "nn",
                            "no",
                            "nr",
                            "nv",
                            "ny",
                            "oc",
                            "oj",
                            "om",
                            "or",
                            "os",
                            "pa",
                            "pi",
                            "pl",
                            "ps",
                            "pt",
                            "qu",
                            "rm",
                            "rn",
                            "ro",
                            "ru",
                            "rw",
                            "sa",
                            "sc",
                            "sd",
                            "se",
                            "sg",
                            "si",
                            "sk",
                            "sl",
                            "sm",
                            "sn",
                            "so",
                            "sq",
                            "sr",
                            "ss",
                            "st",
                            "su",
                            "sv",
                            "sw",
                            "ta",
                            "te",
                            "tg",
                            "th",
                            "ti",
                            "tk",
                            "tl",
                            "tn",
                            "to",
                            "tr",
                            "ts",
                            "tt",
                            "tw",
                            "ty",
                            "ug",
                            "uk",
                            "ur",
                            "uz",
                            "ve",
                            "vi",
                            "vo",
                            "wa",
                            "wo",
                            "xh",
                            "yi",
                            "yo",
                            "za",
                            "zh",
                            "zu"
                          ]
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1
                        },
                        "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                      }
                    },
                    "required": [
                      "seedHash",
                      "seedLanguage",
                      "translations"
                    ]
                  },
                  "reviewBeforeSend": {
                    "description": "Default false. True holds every send this step drafts for the operator to approve, even when the campaign is on autopilot. Nothing is scheduled until they approve it.",
                    "type": "boolean"
                  },
                  "verifyBeforeSend": {
                    "description": "DEPRECATED, and accepted only so campaigns published before the rename still parse. Set `reviewBeforeSend` instead; if both are present the new one wins.",
                    "type": "boolean"
                  },
                  "adaptToCulture": {
                    "description": "Retired: accepted for old steps and ignored. Do not send it.",
                    "type": "boolean"
                  },
                  "attachments": {
                    "description": "Files sent with this step to every lead it reaches: images and PDFs, plus one voice note and one video on a LinkedIn message.",
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "storageKey": {
                          "type": "string",
                          "maxLength": 512,
                          "pattern": "^step-attachments\\/.*",
                          "description": "Where Kairon keeps the file. Send it back as the step returned it."
                        },
                        "fileName": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file name the lead sees."
                        },
                        "mimeType": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file type, for example application/pdf."
                        },
                        "byteSize": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991,
                          "description": "The file size in bytes."
                        }
                      },
                      "required": [
                        "storageKey",
                        "fileName",
                        "mimeType",
                        "byteSize"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "hiringProjectId": {
                    "description": "Send this step from a LinkedIn Recruiter Hiring Project, by its id, paid from the senders' Recruiter allowance. Every sender needs Recruiter, or publish refuses. Leave it out for a normal send.",
                    "type": "string",
                    "pattern": "^\\d+$"
                  }
                },
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "like_last_post",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "reaction": {
                    "default": "like",
                    "description": "Which reaction to leave on the lead's latest own post. 'auto' reads the post and picks the fitting one of the six; a named value always leaves that one. Defaults to 'like', which is what every campaign saved before this field existed does.",
                    "type": "string",
                    "enum": [
                      "like",
                      "celebrate",
                      "support",
                      "love",
                      "insightful",
                      "funny",
                      "auto"
                    ]
                  },
                  "maxPostAgeDays": {
                    "description": "Only react when the lead's latest own post is at most this many days old, 1-3650. When it is older, the step is SKIPPED and the lead moves on; nothing is liked. Defaults to 90 — a like on a years-old post, right before an invite, reads as automation.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650
                  }
                },
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "visit_profile",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {},
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "follow_profile",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {},
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "remove_relation",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {},
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "comment_on_post",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "instruction": {
                    "description": "What the comment should say. UNLIKE a send step, this IS the whole brief: a comment has no operator template to personalize, so the guidance carries the intent alone.",
                    "type": "string",
                    "maxLength": 4000
                  },
                  "condition": {
                    "description": "Only comment when one of their own recent posts meets this test — e.g. \"the post is about AI\". The newest post that meets it is the one commented on; a post that is bad news for its author never meets it. When none does, the step is SKIPPED and the lead moves on to the next step; nothing is posted. Omit it and every eligible post qualifies.",
                    "type": "string",
                    "maxLength": 1000
                  },
                  "maxLength": {
                    "description": "Character ceiling for the comment, up to 1250. Omit and the cap is used.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 1250
                  },
                  "maxPostAgeDays": {
                    "description": "Only consider their own posts from the last this-many days, 1-90. Defaults to 90. In a loop, the step also only considers posts published after it last acted on a post, or last checked and found none that met its condition.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 90
                  },
                  "language": {
                    "description": "Force every message on this step into one language, or set 'auto' so each lead is written to in their OWN language, translating your seed faithfully. OMIT IT and the step uses the default language the sender chose in their settings, or 'auto' when they chose none — which is usually what you want. This rule outranks the seed's original language.",
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "auto"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ]
                      }
                    ]
                  },
                  "reviewBeforeSend": {
                    "description": "Default false. True holds every send this step drafts for the operator to approve, even when the campaign is on autopilot. Nothing is scheduled until they approve it.",
                    "type": "boolean"
                  },
                  "verifyBeforeSend": {
                    "description": "DEPRECATED, and accepted only so campaigns published before the rename still parse. Set `reviewBeforeSend` instead; if both are present the new one wins.",
                    "type": "boolean"
                  }
                },
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "research",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "instructions": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4000,
                    "description": "What the researcher should dig for on each lead. A research step SENDS NOTHING — it spends daily enrollment producing briefs, so place one only when the operator asked for it."
                  }
                },
                "required": [
                  "instructions"
                ],
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "send_email",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "subject": {
                    "default": "",
                    "description": "Required — fixed text you write, never AI-written, in every draftMode. Empty is refused at save and at publish.",
                    "type": "string",
                    "maxLength": 200
                  },
                  "body": {
                    "default": "",
                    "description": "The email body. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`. Custom list columns reach a message two ways: `{{@columnName}}` sends that column's value word for word, and a normal AI slot that mentions a column can use it as a fact, written in the writer's own words. Required.",
                    "type": "string",
                    "maxLength": 8000
                  },
                  "draftMode": {
                    "description": "How the copy is produced. `template`: sent as written — only allowlisted `{{variables}}` and per-lead `{{@slots}}` are substituted, no AI. `ai_template`: the AI personalizes YOUR seed, filling its `{{described slots}}` and nothing else. Absent means `template`.",
                    "type": "string",
                    "enum": [
                      "template",
                      "ai_template"
                    ]
                  },
                  "instruction": {
                    "description": "Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                    "type": "string",
                    "maxLength": 4000
                  },
                  "language": {
                    "description": "Force every message on this step into one language, or set 'auto' so each lead is written to in their OWN language, translating your seed faithfully. OMIT IT and the step uses the default language the sender chose in their settings, or 'auto' when they chose none — which is usually what you want. This rule outranks the seed's original language.",
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "auto"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ]
                      }
                    ]
                  },
                  "localization": {
                    "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                    "type": "object",
                    "properties": {
                      "seedHash": {
                        "type": "string",
                        "minLength": 1,
                        "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                      },
                      "seedLanguage": {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ],
                        "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                      },
                      "translations": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "enum": [
                            "aa",
                            "ab",
                            "ae",
                            "af",
                            "ak",
                            "am",
                            "an",
                            "ar",
                            "as",
                            "av",
                            "ay",
                            "az",
                            "ba",
                            "be",
                            "bg",
                            "bh",
                            "bi",
                            "bm",
                            "bn",
                            "bo",
                            "br",
                            "bs",
                            "ca",
                            "ce",
                            "ch",
                            "co",
                            "cr",
                            "cs",
                            "cu",
                            "cv",
                            "cy",
                            "da",
                            "de",
                            "dv",
                            "dz",
                            "ee",
                            "el",
                            "en",
                            "eo",
                            "es",
                            "et",
                            "eu",
                            "fa",
                            "ff",
                            "fi",
                            "fj",
                            "fo",
                            "fr",
                            "fy",
                            "ga",
                            "gd",
                            "gl",
                            "gn",
                            "gu",
                            "gv",
                            "ha",
                            "he",
                            "hi",
                            "ho",
                            "hr",
                            "ht",
                            "hu",
                            "hy",
                            "hz",
                            "ia",
                            "id",
                            "ie",
                            "ig",
                            "ii",
                            "ik",
                            "io",
                            "is",
                            "it",
                            "iu",
                            "ja",
                            "jv",
                            "ka",
                            "kg",
                            "ki",
                            "kj",
                            "kk",
                            "kl",
                            "km",
                            "kn",
                            "ko",
                            "kr",
                            "ks",
                            "ku",
                            "kv",
                            "kw",
                            "ky",
                            "la",
                            "lb",
                            "lg",
                            "li",
                            "ln",
                            "lo",
                            "lt",
                            "lu",
                            "lv",
                            "mg",
                            "mh",
                            "mi",
                            "mk",
                            "ml",
                            "mn",
                            "mr",
                            "ms",
                            "mt",
                            "my",
                            "na",
                            "nb",
                            "nd",
                            "ne",
                            "ng",
                            "nl",
                            "nn",
                            "no",
                            "nr",
                            "nv",
                            "ny",
                            "oc",
                            "oj",
                            "om",
                            "or",
                            "os",
                            "pa",
                            "pi",
                            "pl",
                            "ps",
                            "pt",
                            "qu",
                            "rm",
                            "rn",
                            "ro",
                            "ru",
                            "rw",
                            "sa",
                            "sc",
                            "sd",
                            "se",
                            "sg",
                            "si",
                            "sk",
                            "sl",
                            "sm",
                            "sn",
                            "so",
                            "sq",
                            "sr",
                            "ss",
                            "st",
                            "su",
                            "sv",
                            "sw",
                            "ta",
                            "te",
                            "tg",
                            "th",
                            "ti",
                            "tk",
                            "tl",
                            "tn",
                            "to",
                            "tr",
                            "ts",
                            "tt",
                            "tw",
                            "ty",
                            "ug",
                            "uk",
                            "ur",
                            "uz",
                            "ve",
                            "vi",
                            "vo",
                            "wa",
                            "wo",
                            "xh",
                            "yi",
                            "yo",
                            "za",
                            "zh",
                            "zu"
                          ]
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1
                        },
                        "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                      }
                    },
                    "required": [
                      "seedHash",
                      "seedLanguage",
                      "translations"
                    ]
                  },
                  "reviewBeforeSend": {
                    "description": "Default false. True holds every send this step drafts for the operator to approve, even when the campaign is on autopilot. Nothing is scheduled until they approve it.",
                    "type": "boolean"
                  },
                  "verifyBeforeSend": {
                    "description": "DEPRECATED, and accepted only so campaigns published before the rename still parse. Set `reviewBeforeSend` instead; if both are present the new one wins.",
                    "type": "boolean"
                  },
                  "adaptToCulture": {
                    "description": "Retired: accepted for old steps and ignored. Do not send it.",
                    "type": "boolean"
                  },
                  "instantlyCampaignId": {
                    "description": "Retired: accepted for old steps and ignored. Do not send it.",
                    "type": "string"
                  },
                  "enrichmentBudgetHours": {
                    "description": "Retired: accepted for old steps and ignored. Do not send it.",
                    "type": "number"
                  },
                  "attachments": {
                    "description": "Files sent with this step to every lead it reaches: images and PDFs, plus one voice note and one video on a LinkedIn message.",
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "storageKey": {
                          "type": "string",
                          "maxLength": 512,
                          "pattern": "^step-attachments\\/.*",
                          "description": "Where Kairon keeps the file. Send it back as the step returned it."
                        },
                        "fileName": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file name the lead sees."
                        },
                        "mimeType": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file type, for example application/pdf."
                        },
                        "byteSize": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991,
                          "description": "The file size in bytes."
                        }
                      },
                      "required": [
                        "storageKey",
                        "fileName",
                        "mimeType",
                        "byteSize"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "condition": {
                    "description": "Only send when one of their own recent posts meets this test - e.g. \"a new job or a promotion\". The newest post that meets it becomes what the message refers to; a post that is bad news for its author never meets it. When none does, the step is SKIPPED and the lead moves on; nothing is sent. Omit it and the message sends as usual.",
                    "type": "string",
                    "maxLength": 1000
                  },
                  "maxPostAgeDays": {
                    "description": "With a condition: Only consider their own posts from the last this-many days, 1-90. Defaults to 90. In a loop, the step also only considers posts published after it last acted on a post, or last checked and found none that met its condition.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 90
                  },
                  "bySender": {
                    "description": "Optional per-sender text, keyed by the sender's user id (`seat_list` → `ownerUserId`). A lead sent by that sender gets this version; every other sender gets the step's own `body`. Same draft mode and language as the step.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "object",
                      "properties": {
                        "body": {
                          "type": "string",
                          "maxLength": 8000,
                          "description": "This sender's message, in place of the step's `body`. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`."
                        },
                        "instruction": {
                          "description": "This sender's note, in place of the step's `instruction`. Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                          "type": "string",
                          "maxLength": 4000
                        },
                        "localization": {
                          "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                          "type": "object",
                          "properties": {
                            "seedHash": {
                              "type": "string",
                              "minLength": 1,
                              "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                            },
                            "seedLanguage": {
                              "type": "string",
                              "enum": [
                                "aa",
                                "ab",
                                "ae",
                                "af",
                                "ak",
                                "am",
                                "an",
                                "ar",
                                "as",
                                "av",
                                "ay",
                                "az",
                                "ba",
                                "be",
                                "bg",
                                "bh",
                                "bi",
                                "bm",
                                "bn",
                                "bo",
                                "br",
                                "bs",
                                "ca",
                                "ce",
                                "ch",
                                "co",
                                "cr",
                                "cs",
                                "cu",
                                "cv",
                                "cy",
                                "da",
                                "de",
                                "dv",
                                "dz",
                                "ee",
                                "el",
                                "en",
                                "eo",
                                "es",
                                "et",
                                "eu",
                                "fa",
                                "ff",
                                "fi",
                                "fj",
                                "fo",
                                "fr",
                                "fy",
                                "ga",
                                "gd",
                                "gl",
                                "gn",
                                "gu",
                                "gv",
                                "ha",
                                "he",
                                "hi",
                                "ho",
                                "hr",
                                "ht",
                                "hu",
                                "hy",
                                "hz",
                                "ia",
                                "id",
                                "ie",
                                "ig",
                                "ii",
                                "ik",
                                "io",
                                "is",
                                "it",
                                "iu",
                                "ja",
                                "jv",
                                "ka",
                                "kg",
                                "ki",
                                "kj",
                                "kk",
                                "kl",
                                "km",
                                "kn",
                                "ko",
                                "kr",
                                "ks",
                                "ku",
                                "kv",
                                "kw",
                                "ky",
                                "la",
                                "lb",
                                "lg",
                                "li",
                                "ln",
                                "lo",
                                "lt",
                                "lu",
                                "lv",
                                "mg",
                                "mh",
                                "mi",
                                "mk",
                                "ml",
                                "mn",
                                "mr",
                                "ms",
                                "mt",
                                "my",
                                "na",
                                "nb",
                                "nd",
                                "ne",
                                "ng",
                                "nl",
                                "nn",
                                "no",
                                "nr",
                                "nv",
                                "ny",
                                "oc",
                                "oj",
                                "om",
                                "or",
                                "os",
                                "pa",
                                "pi",
                                "pl",
                                "ps",
                                "pt",
                                "qu",
                                "rm",
                                "rn",
                                "ro",
                                "ru",
                                "rw",
                                "sa",
                                "sc",
                                "sd",
                                "se",
                                "sg",
                                "si",
                                "sk",
                                "sl",
                                "sm",
                                "sn",
                                "so",
                                "sq",
                                "sr",
                                "ss",
                                "st",
                                "su",
                                "sv",
                                "sw",
                                "ta",
                                "te",
                                "tg",
                                "th",
                                "ti",
                                "tk",
                                "tl",
                                "tn",
                                "to",
                                "tr",
                                "ts",
                                "tt",
                                "tw",
                                "ty",
                                "ug",
                                "uk",
                                "ur",
                                "uz",
                                "ve",
                                "vi",
                                "vo",
                                "wa",
                                "wo",
                                "xh",
                                "yi",
                                "yo",
                                "za",
                                "zh",
                                "zu"
                              ],
                              "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                            },
                            "translations": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string",
                                "enum": [
                                  "aa",
                                  "ab",
                                  "ae",
                                  "af",
                                  "ak",
                                  "am",
                                  "an",
                                  "ar",
                                  "as",
                                  "av",
                                  "ay",
                                  "az",
                                  "ba",
                                  "be",
                                  "bg",
                                  "bh",
                                  "bi",
                                  "bm",
                                  "bn",
                                  "bo",
                                  "br",
                                  "bs",
                                  "ca",
                                  "ce",
                                  "ch",
                                  "co",
                                  "cr",
                                  "cs",
                                  "cu",
                                  "cv",
                                  "cy",
                                  "da",
                                  "de",
                                  "dv",
                                  "dz",
                                  "ee",
                                  "el",
                                  "en",
                                  "eo",
                                  "es",
                                  "et",
                                  "eu",
                                  "fa",
                                  "ff",
                                  "fi",
                                  "fj",
                                  "fo",
                                  "fr",
                                  "fy",
                                  "ga",
                                  "gd",
                                  "gl",
                                  "gn",
                                  "gu",
                                  "gv",
                                  "ha",
                                  "he",
                                  "hi",
                                  "ho",
                                  "hr",
                                  "ht",
                                  "hu",
                                  "hy",
                                  "hz",
                                  "ia",
                                  "id",
                                  "ie",
                                  "ig",
                                  "ii",
                                  "ik",
                                  "io",
                                  "is",
                                  "it",
                                  "iu",
                                  "ja",
                                  "jv",
                                  "ka",
                                  "kg",
                                  "ki",
                                  "kj",
                                  "kk",
                                  "kl",
                                  "km",
                                  "kn",
                                  "ko",
                                  "kr",
                                  "ks",
                                  "ku",
                                  "kv",
                                  "kw",
                                  "ky",
                                  "la",
                                  "lb",
                                  "lg",
                                  "li",
                                  "ln",
                                  "lo",
                                  "lt",
                                  "lu",
                                  "lv",
                                  "mg",
                                  "mh",
                                  "mi",
                                  "mk",
                                  "ml",
                                  "mn",
                                  "mr",
                                  "ms",
                                  "mt",
                                  "my",
                                  "na",
                                  "nb",
                                  "nd",
                                  "ne",
                                  "ng",
                                  "nl",
                                  "nn",
                                  "no",
                                  "nr",
                                  "nv",
                                  "ny",
                                  "oc",
                                  "oj",
                                  "om",
                                  "or",
                                  "os",
                                  "pa",
                                  "pi",
                                  "pl",
                                  "ps",
                                  "pt",
                                  "qu",
                                  "rm",
                                  "rn",
                                  "ro",
                                  "ru",
                                  "rw",
                                  "sa",
                                  "sc",
                                  "sd",
                                  "se",
                                  "sg",
                                  "si",
                                  "sk",
                                  "sl",
                                  "sm",
                                  "sn",
                                  "so",
                                  "sq",
                                  "sr",
                                  "ss",
                                  "st",
                                  "su",
                                  "sv",
                                  "sw",
                                  "ta",
                                  "te",
                                  "tg",
                                  "th",
                                  "ti",
                                  "tk",
                                  "tl",
                                  "tn",
                                  "to",
                                  "tr",
                                  "ts",
                                  "tt",
                                  "tw",
                                  "ty",
                                  "ug",
                                  "uk",
                                  "ur",
                                  "uz",
                                  "ve",
                                  "vi",
                                  "vo",
                                  "wa",
                                  "wo",
                                  "xh",
                                  "yi",
                                  "yo",
                                  "za",
                                  "zh",
                                  "zu"
                                ]
                              },
                              "additionalProperties": {
                                "type": "string",
                                "minLength": 1
                              },
                              "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                            }
                          },
                          "required": [
                            "seedHash",
                            "seedLanguage",
                            "translations"
                          ]
                        }
                      },
                      "required": [
                        "body"
                      ]
                    }
                  },
                  "attachmentsBySender": {
                    "description": "Optional per-sender files, keyed by the sender's user id (`seat_list` → `ownerUserId`): that sender's leads get these files instead of the step's `attachments` (an empty list sends none). Read-only notes — add files through `attachments` first.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "maxItems": 5,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "storageKey": {
                            "type": "string",
                            "maxLength": 512,
                            "pattern": "^step-attachments\\/.*",
                            "description": "Where Kairon keeps the file. Send it back as the step returned it."
                          },
                          "fileName": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 255,
                            "description": "The file name the lead sees."
                          },
                          "mimeType": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 255,
                            "description": "The file type, for example application/pdf."
                          },
                          "byteSize": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991,
                            "description": "The file size in bytes."
                          }
                        },
                        "required": [
                          "storageKey",
                          "fileName",
                          "mimeType",
                          "byteSize"
                        ],
                        "additionalProperties": false
                      }
                    }
                  }
                },
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "send_whatsapp",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "body": {
                    "default": "",
                    "description": "The message. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`. Custom list columns reach a message two ways: `{{@columnName}}` sends that column's value word for word, and a normal AI slot that mentions a column can use it as a fact, written in the writer's own words. To send this as SEVERAL messages rather than one, separate them with a line containing only `---`. Each part arrives as its own LinkedIn message a couple of seconds later, in the same conversation — what a person does when they type a short opener and then the reason they wrote. The whole thing still counts as ONE send against the daily limit. This is the same thing the \"Add bubble\" button does in the campaign editor.",
                    "type": "string",
                    "maxLength": 8000
                  },
                  "draftMode": {
                    "description": "How the copy is produced. `template`: sent as written — only allowlisted `{{variables}}` and per-lead `{{@slots}}` are substituted, no AI. `ai_template`: the AI personalizes YOUR seed, filling its `{{described slots}}` and nothing else. Absent means `template`.",
                    "type": "string",
                    "enum": [
                      "template",
                      "ai_template"
                    ]
                  },
                  "instruction": {
                    "description": "Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                    "type": "string",
                    "maxLength": 4000
                  },
                  "language": {
                    "description": "Force every message on this step into one language, or set 'auto' so each lead is written to in their OWN language, translating your seed faithfully. OMIT IT and the step uses the default language the sender chose in their settings, or 'auto' when they chose none — which is usually what you want. This rule outranks the seed's original language.",
                    "anyOf": [
                      {
                        "type": "string",
                        "const": "auto"
                      },
                      {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ]
                      }
                    ]
                  },
                  "localization": {
                    "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                    "type": "object",
                    "properties": {
                      "seedHash": {
                        "type": "string",
                        "minLength": 1,
                        "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                      },
                      "seedLanguage": {
                        "type": "string",
                        "enum": [
                          "aa",
                          "ab",
                          "ae",
                          "af",
                          "ak",
                          "am",
                          "an",
                          "ar",
                          "as",
                          "av",
                          "ay",
                          "az",
                          "ba",
                          "be",
                          "bg",
                          "bh",
                          "bi",
                          "bm",
                          "bn",
                          "bo",
                          "br",
                          "bs",
                          "ca",
                          "ce",
                          "ch",
                          "co",
                          "cr",
                          "cs",
                          "cu",
                          "cv",
                          "cy",
                          "da",
                          "de",
                          "dv",
                          "dz",
                          "ee",
                          "el",
                          "en",
                          "eo",
                          "es",
                          "et",
                          "eu",
                          "fa",
                          "ff",
                          "fi",
                          "fj",
                          "fo",
                          "fr",
                          "fy",
                          "ga",
                          "gd",
                          "gl",
                          "gn",
                          "gu",
                          "gv",
                          "ha",
                          "he",
                          "hi",
                          "ho",
                          "hr",
                          "ht",
                          "hu",
                          "hy",
                          "hz",
                          "ia",
                          "id",
                          "ie",
                          "ig",
                          "ii",
                          "ik",
                          "io",
                          "is",
                          "it",
                          "iu",
                          "ja",
                          "jv",
                          "ka",
                          "kg",
                          "ki",
                          "kj",
                          "kk",
                          "kl",
                          "km",
                          "kn",
                          "ko",
                          "kr",
                          "ks",
                          "ku",
                          "kv",
                          "kw",
                          "ky",
                          "la",
                          "lb",
                          "lg",
                          "li",
                          "ln",
                          "lo",
                          "lt",
                          "lu",
                          "lv",
                          "mg",
                          "mh",
                          "mi",
                          "mk",
                          "ml",
                          "mn",
                          "mr",
                          "ms",
                          "mt",
                          "my",
                          "na",
                          "nb",
                          "nd",
                          "ne",
                          "ng",
                          "nl",
                          "nn",
                          "no",
                          "nr",
                          "nv",
                          "ny",
                          "oc",
                          "oj",
                          "om",
                          "or",
                          "os",
                          "pa",
                          "pi",
                          "pl",
                          "ps",
                          "pt",
                          "qu",
                          "rm",
                          "rn",
                          "ro",
                          "ru",
                          "rw",
                          "sa",
                          "sc",
                          "sd",
                          "se",
                          "sg",
                          "si",
                          "sk",
                          "sl",
                          "sm",
                          "sn",
                          "so",
                          "sq",
                          "sr",
                          "ss",
                          "st",
                          "su",
                          "sv",
                          "sw",
                          "ta",
                          "te",
                          "tg",
                          "th",
                          "ti",
                          "tk",
                          "tl",
                          "tn",
                          "to",
                          "tr",
                          "ts",
                          "tt",
                          "tw",
                          "ty",
                          "ug",
                          "uk",
                          "ur",
                          "uz",
                          "ve",
                          "vi",
                          "vo",
                          "wa",
                          "wo",
                          "xh",
                          "yi",
                          "yo",
                          "za",
                          "zh",
                          "zu"
                        ],
                        "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                      },
                      "translations": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "enum": [
                            "aa",
                            "ab",
                            "ae",
                            "af",
                            "ak",
                            "am",
                            "an",
                            "ar",
                            "as",
                            "av",
                            "ay",
                            "az",
                            "ba",
                            "be",
                            "bg",
                            "bh",
                            "bi",
                            "bm",
                            "bn",
                            "bo",
                            "br",
                            "bs",
                            "ca",
                            "ce",
                            "ch",
                            "co",
                            "cr",
                            "cs",
                            "cu",
                            "cv",
                            "cy",
                            "da",
                            "de",
                            "dv",
                            "dz",
                            "ee",
                            "el",
                            "en",
                            "eo",
                            "es",
                            "et",
                            "eu",
                            "fa",
                            "ff",
                            "fi",
                            "fj",
                            "fo",
                            "fr",
                            "fy",
                            "ga",
                            "gd",
                            "gl",
                            "gn",
                            "gu",
                            "gv",
                            "ha",
                            "he",
                            "hi",
                            "ho",
                            "hr",
                            "ht",
                            "hu",
                            "hy",
                            "hz",
                            "ia",
                            "id",
                            "ie",
                            "ig",
                            "ii",
                            "ik",
                            "io",
                            "is",
                            "it",
                            "iu",
                            "ja",
                            "jv",
                            "ka",
                            "kg",
                            "ki",
                            "kj",
                            "kk",
                            "kl",
                            "km",
                            "kn",
                            "ko",
                            "kr",
                            "ks",
                            "ku",
                            "kv",
                            "kw",
                            "ky",
                            "la",
                            "lb",
                            "lg",
                            "li",
                            "ln",
                            "lo",
                            "lt",
                            "lu",
                            "lv",
                            "mg",
                            "mh",
                            "mi",
                            "mk",
                            "ml",
                            "mn",
                            "mr",
                            "ms",
                            "mt",
                            "my",
                            "na",
                            "nb",
                            "nd",
                            "ne",
                            "ng",
                            "nl",
                            "nn",
                            "no",
                            "nr",
                            "nv",
                            "ny",
                            "oc",
                            "oj",
                            "om",
                            "or",
                            "os",
                            "pa",
                            "pi",
                            "pl",
                            "ps",
                            "pt",
                            "qu",
                            "rm",
                            "rn",
                            "ro",
                            "ru",
                            "rw",
                            "sa",
                            "sc",
                            "sd",
                            "se",
                            "sg",
                            "si",
                            "sk",
                            "sl",
                            "sm",
                            "sn",
                            "so",
                            "sq",
                            "sr",
                            "ss",
                            "st",
                            "su",
                            "sv",
                            "sw",
                            "ta",
                            "te",
                            "tg",
                            "th",
                            "ti",
                            "tk",
                            "tl",
                            "tn",
                            "to",
                            "tr",
                            "ts",
                            "tt",
                            "tw",
                            "ty",
                            "ug",
                            "uk",
                            "ur",
                            "uz",
                            "ve",
                            "vi",
                            "vo",
                            "wa",
                            "wo",
                            "xh",
                            "yi",
                            "yo",
                            "za",
                            "zh",
                            "zu"
                          ]
                        },
                        "additionalProperties": {
                          "type": "string",
                          "minLength": 1
                        },
                        "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                      }
                    },
                    "required": [
                      "seedHash",
                      "seedLanguage",
                      "translations"
                    ]
                  },
                  "reviewBeforeSend": {
                    "description": "Default false. True holds every send this step drafts for the operator to approve, even when the campaign is on autopilot. Nothing is scheduled until they approve it.",
                    "type": "boolean"
                  },
                  "verifyBeforeSend": {
                    "description": "DEPRECATED, and accepted only so campaigns published before the rename still parse. Set `reviewBeforeSend` instead; if both are present the new one wins.",
                    "type": "boolean"
                  },
                  "adaptToCulture": {
                    "description": "Retired: accepted for old steps and ignored. Do not send it.",
                    "type": "boolean"
                  },
                  "condition": {
                    "description": "Only send when one of their own recent posts meets this test - e.g. \"a new job or a promotion\". The newest post that meets it becomes what the message refers to; a post that is bad news for its author never meets it. When none does, the step is SKIPPED and the lead moves on; nothing is sent. Omit it and the message sends as usual.",
                    "type": "string",
                    "maxLength": 1000
                  },
                  "maxPostAgeDays": {
                    "description": "With a condition: Only consider their own posts from the last this-many days, 1-90. Defaults to 90. In a loop, the step also only considers posts published after it last acted on a post, or last checked and found none that met its condition.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 90
                  },
                  "bySender": {
                    "description": "Optional per-sender text, keyed by the sender's user id (`seat_list` → `ownerUserId`). A lead sent by that sender gets this version; every other sender gets the step's own `body`. Same draft mode and language as the step.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "object",
                      "properties": {
                        "body": {
                          "type": "string",
                          "maxLength": 8000,
                          "description": "This sender's message, in place of the step's `body`. In `ai_template` this seed is authoritative: the writer reproduces it word for word and adds nothing, so EVERY per-lead detail must sit inside a `{{...}}` slot written here. A seed with no slots sends the identical message to every lead. A slot holds a description of the fact to write there, phrased as a clause — e.g. `{{one short clause, 8-14 words, on what their company does}}`."
                        },
                        "instruction": {
                          "description": "This sender's note, in place of the step's `instruction`. Optional note on tone and register, layered on the seed — NOT where the copy comes from. It reaches the writer AFTER the rule that says to keep the seed as written, so anything it asks for that the seed has no `{{slot}}` for is silently ignored: \"personalize the opening with their company\" does nothing unless a slot sits there. Write the copy in the seed.",
                          "type": "string",
                          "maxLength": 4000
                        },
                        "localization": {
                          "description": "The seed translated into other languages, one per ISO 639-1 code, each keeping every `{{…}}` slot byte-exact and every `---` line. Kairon writes a language here the first time it drafts a lead in it; you may edit any entry and it is then used as written for every later lead in that language. Leave it out to let Kairon translate.",
                          "type": "object",
                          "properties": {
                            "seedHash": {
                              "type": "string",
                              "minLength": 1,
                              "description": "Hash of the seed text these translations were made for. Kairon sets it; when the seed changes, the whole object goes stale and is rebuilt. Copy it through unchanged."
                            },
                            "seedLanguage": {
                              "type": "string",
                              "enum": [
                                "aa",
                                "ab",
                                "ae",
                                "af",
                                "ak",
                                "am",
                                "an",
                                "ar",
                                "as",
                                "av",
                                "ay",
                                "az",
                                "ba",
                                "be",
                                "bg",
                                "bh",
                                "bi",
                                "bm",
                                "bn",
                                "bo",
                                "br",
                                "bs",
                                "ca",
                                "ce",
                                "ch",
                                "co",
                                "cr",
                                "cs",
                                "cu",
                                "cv",
                                "cy",
                                "da",
                                "de",
                                "dv",
                                "dz",
                                "ee",
                                "el",
                                "en",
                                "eo",
                                "es",
                                "et",
                                "eu",
                                "fa",
                                "ff",
                                "fi",
                                "fj",
                                "fo",
                                "fr",
                                "fy",
                                "ga",
                                "gd",
                                "gl",
                                "gn",
                                "gu",
                                "gv",
                                "ha",
                                "he",
                                "hi",
                                "ho",
                                "hr",
                                "ht",
                                "hu",
                                "hy",
                                "hz",
                                "ia",
                                "id",
                                "ie",
                                "ig",
                                "ii",
                                "ik",
                                "io",
                                "is",
                                "it",
                                "iu",
                                "ja",
                                "jv",
                                "ka",
                                "kg",
                                "ki",
                                "kj",
                                "kk",
                                "kl",
                                "km",
                                "kn",
                                "ko",
                                "kr",
                                "ks",
                                "ku",
                                "kv",
                                "kw",
                                "ky",
                                "la",
                                "lb",
                                "lg",
                                "li",
                                "ln",
                                "lo",
                                "lt",
                                "lu",
                                "lv",
                                "mg",
                                "mh",
                                "mi",
                                "mk",
                                "ml",
                                "mn",
                                "mr",
                                "ms",
                                "mt",
                                "my",
                                "na",
                                "nb",
                                "nd",
                                "ne",
                                "ng",
                                "nl",
                                "nn",
                                "no",
                                "nr",
                                "nv",
                                "ny",
                                "oc",
                                "oj",
                                "om",
                                "or",
                                "os",
                                "pa",
                                "pi",
                                "pl",
                                "ps",
                                "pt",
                                "qu",
                                "rm",
                                "rn",
                                "ro",
                                "ru",
                                "rw",
                                "sa",
                                "sc",
                                "sd",
                                "se",
                                "sg",
                                "si",
                                "sk",
                                "sl",
                                "sm",
                                "sn",
                                "so",
                                "sq",
                                "sr",
                                "ss",
                                "st",
                                "su",
                                "sv",
                                "sw",
                                "ta",
                                "te",
                                "tg",
                                "th",
                                "ti",
                                "tk",
                                "tl",
                                "tn",
                                "to",
                                "tr",
                                "ts",
                                "tt",
                                "tw",
                                "ty",
                                "ug",
                                "uk",
                                "ur",
                                "uz",
                                "ve",
                                "vi",
                                "vo",
                                "wa",
                                "wo",
                                "xh",
                                "yi",
                                "yo",
                                "za",
                                "zh",
                                "zu"
                              ],
                              "description": "The ISO 639-1 code of the language the seed itself is written in, detected once by Kairon."
                            },
                            "translations": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string",
                                "enum": [
                                  "aa",
                                  "ab",
                                  "ae",
                                  "af",
                                  "ak",
                                  "am",
                                  "an",
                                  "ar",
                                  "as",
                                  "av",
                                  "ay",
                                  "az",
                                  "ba",
                                  "be",
                                  "bg",
                                  "bh",
                                  "bi",
                                  "bm",
                                  "bn",
                                  "bo",
                                  "br",
                                  "bs",
                                  "ca",
                                  "ce",
                                  "ch",
                                  "co",
                                  "cr",
                                  "cs",
                                  "cu",
                                  "cv",
                                  "cy",
                                  "da",
                                  "de",
                                  "dv",
                                  "dz",
                                  "ee",
                                  "el",
                                  "en",
                                  "eo",
                                  "es",
                                  "et",
                                  "eu",
                                  "fa",
                                  "ff",
                                  "fi",
                                  "fj",
                                  "fo",
                                  "fr",
                                  "fy",
                                  "ga",
                                  "gd",
                                  "gl",
                                  "gn",
                                  "gu",
                                  "gv",
                                  "ha",
                                  "he",
                                  "hi",
                                  "ho",
                                  "hr",
                                  "ht",
                                  "hu",
                                  "hy",
                                  "hz",
                                  "ia",
                                  "id",
                                  "ie",
                                  "ig",
                                  "ii",
                                  "ik",
                                  "io",
                                  "is",
                                  "it",
                                  "iu",
                                  "ja",
                                  "jv",
                                  "ka",
                                  "kg",
                                  "ki",
                                  "kj",
                                  "kk",
                                  "kl",
                                  "km",
                                  "kn",
                                  "ko",
                                  "kr",
                                  "ks",
                                  "ku",
                                  "kv",
                                  "kw",
                                  "ky",
                                  "la",
                                  "lb",
                                  "lg",
                                  "li",
                                  "ln",
                                  "lo",
                                  "lt",
                                  "lu",
                                  "lv",
                                  "mg",
                                  "mh",
                                  "mi",
                                  "mk",
                                  "ml",
                                  "mn",
                                  "mr",
                                  "ms",
                                  "mt",
                                  "my",
                                  "na",
                                  "nb",
                                  "nd",
                                  "ne",
                                  "ng",
                                  "nl",
                                  "nn",
                                  "no",
                                  "nr",
                                  "nv",
                                  "ny",
                                  "oc",
                                  "oj",
                                  "om",
                                  "or",
                                  "os",
                                  "pa",
                                  "pi",
                                  "pl",
                                  "ps",
                                  "pt",
                                  "qu",
                                  "rm",
                                  "rn",
                                  "ro",
                                  "ru",
                                  "rw",
                                  "sa",
                                  "sc",
                                  "sd",
                                  "se",
                                  "sg",
                                  "si",
                                  "sk",
                                  "sl",
                                  "sm",
                                  "sn",
                                  "so",
                                  "sq",
                                  "sr",
                                  "ss",
                                  "st",
                                  "su",
                                  "sv",
                                  "sw",
                                  "ta",
                                  "te",
                                  "tg",
                                  "th",
                                  "ti",
                                  "tk",
                                  "tl",
                                  "tn",
                                  "to",
                                  "tr",
                                  "ts",
                                  "tt",
                                  "tw",
                                  "ty",
                                  "ug",
                                  "uk",
                                  "ur",
                                  "uz",
                                  "ve",
                                  "vi",
                                  "vo",
                                  "wa",
                                  "wo",
                                  "xh",
                                  "yi",
                                  "yo",
                                  "za",
                                  "zh",
                                  "zu"
                                ]
                              },
                              "additionalProperties": {
                                "type": "string",
                                "minLength": 1
                              },
                              "description": "One translated seed per ISO 639-1 code. Each must keep every `{{…}}` slot byte-exact and in order, and the same number of `---` lines, or publish refuses it."
                            }
                          },
                          "required": [
                            "seedHash",
                            "seedLanguage",
                            "translations"
                          ]
                        }
                      },
                      "required": [
                        "body"
                      ]
                    }
                  },
                  "attachments": {
                    "description": "Files sent with this step to every lead it reaches: images and PDFs, plus one voice note and one video on a LinkedIn message.",
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "storageKey": {
                          "type": "string",
                          "maxLength": 512,
                          "pattern": "^step-attachments\\/.*",
                          "description": "Where Kairon keeps the file. Send it back as the step returned it."
                        },
                        "fileName": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file name the lead sees."
                        },
                        "mimeType": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 255,
                          "description": "The file type, for example application/pdf."
                        },
                        "byteSize": {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 9007199254740991,
                          "description": "The file size in bytes."
                        }
                      },
                      "required": [
                        "storageKey",
                        "fileName",
                        "mimeType",
                        "byteSize"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "attachmentsBySender": {
                    "description": "Optional per-sender files, keyed by the sender's user id (`seat_list` → `ownerUserId`): that sender's leads get these files instead of the step's `attachments` (an empty list sends none). Read-only notes — add files through `attachments` first.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "maxItems": 5,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "storageKey": {
                            "type": "string",
                            "maxLength": 512,
                            "pattern": "^step-attachments\\/.*",
                            "description": "Where Kairon keeps the file. Send it back as the step returned it."
                          },
                          "fileName": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 255,
                            "description": "The file name the lead sees."
                          },
                          "mimeType": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 255,
                            "description": "The file type, for example application/pdf."
                          },
                          "byteSize": {
                            "type": "integer",
                            "exclusiveMinimum": 0,
                            "maximum": 9007199254740991,
                            "description": "The file size in bytes."
                          }
                        },
                        "required": [
                          "storageKey",
                          "fileName",
                          "mimeType",
                          "byteSize"
                        ],
                        "additionalProperties": false
                      }
                    }
                  }
                },
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          },
          {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80,
                "description": "A stable id you choose for this step; edges and `campaign_edit_graph` name it by this key. Unique within the graph."
              },
              "type": {
                "type": "string",
                "const": "audience_split",
                "description": "Which kind of step this is. It decides the shape of `config`, and which outcome edges the step may route on."
              },
              "config": {
                "type": "object",
                "properties": {
                  "weightA": {
                    "default": 50,
                    "description": "Percent of enrolling leads sent down branch A; the rest go down branch B. Use 50 for an even test — 0 or 100 turns the test off and is what applying a winner writes.",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "metric": {
                    "type": "string",
                    "enum": [
                      "accept_rate",
                      "reply_rate"
                    ],
                    "description": "What counts as a win when comparing the two branches. Read by Split Review only — it changes nothing about how the campaign runs."
                  },
                  "checkpoint": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "const": "calculated",
                            "description": "Work the sample size out from past results."
                          },
                          "minimumDetectableEffectPoints": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 50,
                            "description": "The smallest gap worth spotting, in percentage points — 10 means \"tell me once one branch is 10 points ahead\". Smaller numbers need many more leads."
                          }
                        },
                        "required": [
                          "mode",
                          "minimumDetectableEffectPoints"
                        ]
                      },
                      {
                        "type": "object",
                        "properties": {
                          "mode": {
                            "type": "string",
                            "const": "manual",
                            "description": "State the finish line yourself."
                          },
                          "by": {
                            "oneOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "unit": {
                                    "type": "string",
                                    "const": "date",
                                    "description": "Finish on a calendar day."
                                  },
                                  "at": {
                                    "type": "string",
                                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                                    "description": "The day the test may be judged, `YYYY-MM-DD`, read in the campaign’s own timezone."
                                  }
                                },
                                "required": [
                                  "unit",
                                  "at"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "unit": {
                                    "type": "string",
                                    "const": "count",
                                    "description": "Finish on a lead count."
                                  },
                                  "leadsPerBranch": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 9007199254740991,
                                    "description": "How many leads EACH branch must reach before a winner may be named."
                                  }
                                },
                                "required": [
                                  "unit",
                                  "leadsPerBranch"
                                ]
                              }
                            ],
                            "description": "Whether the finish line is a date or a per-branch lead count."
                          }
                        },
                        "required": [
                          "mode",
                          "by"
                        ]
                      }
                    ],
                    "description": "When a winner may be declared. No winner is ever named before this point, however far ahead one branch already looks — an early peek is how an A/B test lies."
                  }
                },
                "required": [
                  "metric",
                  "checkpoint"
                ],
                "additionalProperties": false,
                "description": "Settings for this step type. The fields differ per `type`."
              },
              "uiPosition": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number"
                  },
                  "y": {
                    "type": "number"
                  }
                },
                "required": [
                  "x",
                  "y"
                ]
              }
            },
            "required": [
              "key",
              "type",
              "config",
              "uiPosition"
            ]
          }
        ]
      },
      "x-nestjs_zod-uses-3-point-1-syntax": true
    },
    "edges": {
      "maxItems": 300,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "fromKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "The `key` of the step this edge leaves."
          },
          "toKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "The `key` of the step it routes to."
          },
          "condition": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40,
            "description": "Which OUTCOME of `fromKey` takes this edge — e.g. `sent`, `accepted`, `timeout`, `done`, `default`. Each step type emits a fixed set, and a condition it does not emit is refused. Some are REQUIRED: leave `wait_connection_accepted`'s `accepted` or a `delay`'s `default` unwired and publish fails with `required_outcome_unwired`."
          }
        },
        "required": [
          "fromKey",
          "toKey",
          "condition"
        ]
      },
      "x-nestjs_zod-uses-3-point-1-syntax": true
    },
    "startNodeKey": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "null"
        }
      ],
      "x-nestjs_zod-uses-3-point-1-syntax": true,
      "x-nestjs_zod-empty-type": true
    }
  },
  "required": [
    "nodes",
    "edges",
    "startNodeKey"
  ]
}